RegExp
От: Аноним  
Дата: 29.05.07 07:34
Оценка:
Есть xml-файл. Нужно найти все переменные, в нем. Переменные описываются так: [var1]. Регулярное выражение для поиска:

\[A-Za-z_][A-Za-z0-9_]*\]

Но таким способом ищутся не все переменные, например в выражении: Text="[Price*(1-NDS/(NDS+100))*Kol]" переменные NDS, Price, Kol не будут найдены.


<TfrxMemoView Name="Memo15" Left="1" Top="0" Width="33" Height="14" StretchMode="smMaxHeight" Font.Charset="204" Font.Color="0" Font.Height="-9" Font.Name="Bookman Old Style" Font.Style="2" Frame.Typ="15" Frame.Width="0,5" ParentFont="False" Text=" [LINE#]."/>
      <TfrxMemoView Name="Memo28" Left="34" Top="0" Width="236" Height="14" StretchMode="smMaxHeight" Font.Charset="204" Font.Color="0" Font.Height="-9" Font.Name="Bookman Old Style" Font.Style="2" Frame.Typ="15" Frame.Width="0,5" ParentFont="False" Text=""/>
      <TfrxMemoView Name="Memo35" Left="309" Top="0" Width="49" Height="14" StretchMode="smMaxHeight" Font.Charset="204" Font.Color="0" Font.Height="-9" Font.Name="Bookman Old Style" Font.Style="2" Frame.Typ="15" Frame.Width="0,5" HAlign="haCenter" ParentFont="False" WordBreak="True" Text="[VolName]"/>
      <TfrxMemoView Name="Memo36" Left="467" Top="0" Width="41" Height="14" StretchMode="smMaxHeight" Font.Charset="204" Font.Color="0" Font.Height="-9" Font.Name="Bookman Old Style" Font.Style="2" Frame.Typ="15" Frame.Width="0,5" HAlign="haRight" ParentFont="False" Text="[Places]"/>
      <TfrxMemoView Name="Memo39" Left="644" Top="0" Width="83" Height="14" StretchMode="smMaxHeight" Font.Charset="204" Font.Color="0" Font.Height="-9" Font.Name="Bookman Old Style" Font.Style="2" Frame.Typ="15" Frame.Width="0,5" HAlign="haRight" ParentFont="False" Text="[Price*(1-NDS/(NDS+100))]"/>
      <TfrxMemoView Name="Memo40" Left="727" Top="0" Width="83" Height="14" StretchMode="smMaxHeight" Font.Charset="204" Font.Color="0" Font.Height="-9" Font.Name="Bookman Old Style" Font.Style="2" Frame.Typ="15" Frame.Width="0,5" HAlign="haRight" ParentFont="False" Text="[Price*(1-NDS/(NDS+100))*Kol]"/>
Re: RegExp
От: SlaVVVa Россия  
Дата: 29.05.07 12:44
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Регулярное выражение для поиска: \[A-Za-z_][A-Za-z0-9_]*\]

А>Но таким способом ищутся не все переменные, например в выражении: Text="[Price*(1-NDS/(NDS+100))*Kol]" переменные NDS, Price, Kol не будут найдены.

Правильно ли будет заключить, что
— внутри квадратных скобок
— любая последавательность латинских букв
— отделенных любым другим знаком
— будет именем переменной ?

если да, то регулярное выражение составить не трудно,
если нет уточните по каким критериям можно выделить "имя переменной".
Поймете смысл — найдутся слова.
Катон.
Re[2]: RegExp
От: Аноним  
Дата: 30.05.07 05:44
Оценка:
Здравствуйте, SlaVVVa, Вы писали:

SVV>Здравствуйте, Аноним, Вы писали:


А>>Регулярное выражение для поиска: \[A-Za-z_][A-Za-z0-9_]*\]

А>>Но таким способом ищутся не все переменные, например в выражении: Text="[Price*(1-NDS/(NDS+100))*Kol]" переменные NDS, Price, Kol не будут найдены.

SVV>Правильно ли будет заключить, что

SVV>- внутри квадратных скобок
SVV>- любая последавательность латинских букв
SVV>- отделенных любым другим знаком
SVV>- будет именем переменной ?

Да

SVV>если да, то регулярное выражение составить не трудно,

SVV>если нет уточните по каким критериям можно выделить "имя переменной".
Re: RegExp
От: Red Bird Россия  
Дата: 30.05.07 06:41
Оценка:
Смотрите в сторону XPath...
Re[3]: RegExp
От: SlaVVVa Россия  
Дата: 30.05.07 07:18
Оценка:
Здравствуйте, Аноним, Вы писали:


using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            FindVarName();
        }

        static public void FindVarName()
        {
            Regex reg;
            Match match;
            MatchCollection mc;

            string text = "<TfrxMemoView Name=\"Memo40\" Left=\"727\" Top=\"0\" Width=\"83\" Height=\"14\" StretchMode=\"smMaxHeight\" Font.Charset=\"204\" Font.Color=\"0\" Font.Height=\"-9\" Font.Name=\"Bookman Old Style\" Font.Style=\"2\" Frame.Typ=\"15\" Frame.Width=\"0,5\" HAlign=\"haRight\" ParentFont=\"False\" Text=\"[Price*(1-NDS/(NDS+100))*Kol]\"/>";
            string subStr = String.Empty;
            string patternForSubString = "\\sText=\"\\[(?<subStr>(.*))\\]\"\\/\\>";
            string patternVarName = "[^A-Za-z0-9_]*(?<var>([A-Za-z_][A-Za-z0-9_]+))[^A-Za-z0-9_]*";
            List<string> varNames = new List<string>();

            match = Regex.Match(text, patternForSubString);
            if (match.Success)
            {
                subStr = match.Groups["subStr"].Value;

                reg = new Regex(patternVarName);
                mc = reg.Matches(subStr);
                for (int i = 0; i < mc.Count; i++)
                {
                    if (!varNames.Contains(mc[i].Groups["var"].Value))
                    {
                        varNames.Add(mc[i].Groups["var"].Value);
                    }
                }

                foreach (string var in varNames)
                {
                    Console.WriteLine(var);
                }
            }
            
            Console.ReadLine();
        }
    }
}



Побалуйтесь с примером думаю разберетесь.
Если что спрашивайте.
Поймете смысл — найдутся слова.
Катон.
Re[2]: RegExp
От: Lloyd Россия  
Дата: 30.05.07 12:06
Оценка:
Здравствуйте, Red Bird, Вы писали:

RB>Смотрите в сторону XPath...


Примерчик накидаете?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: RegExp
От: izekia  
Дата: 22.12.07 22:09
Оценка:
Здравствуйте, Red Bird, Вы писали:

RB>Смотрите в сторону XPath...


XPath здесь поможет выбрать выражения, но не сами переменные, как бы это уже не его задача

Вообще насколько я понял из структуры файла XML — автор собирается на основе выбранных переменных потом генерировать файл представления
Если я прав — то стоит посмотреть в сторону XSLT, это именно то что используется для таких задач, XPath, кстати там используется для описания шаблонов поиска
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.