Интересная задачка на регулярные выражения !
От: zaika  
Дата: 14.05.05 15:57
Оценка:
Есть строка, представляющая собой название и значения переменной перечислимого типа:

variable <name> {<value1>, <value2>, <value3>, ...}


В виде регулярного выражения это записывается следующим образом:

@"variable\s+"+@"(?<name>\S+)\s*\{\s*(?<value1>\S+)\s*(,\s*(?<valueI>\S+))*\}"

Как можно извлекать эти valueI?
Точное их количество неизвестно...
Re: Интересная задачка на регулярные выражения !
От: V.Petrovski Беларусь  
Дата: 14.05.05 18:27
Оценка: 3 (1)
Здравствуйте, zaika, Вы писали:

Z>Как можно извлекать эти valueI?

Z>Точное их количество неизвестно...

Вот выражение
variable\s+(?<name>[a-zA-Z_$][a-zA-Z0-9_$]*)\s*\{\s*(?<value>[^,\s]+)\s*(\,\s*(?<value>[^,\s]+)\s*)*\}


вот на этих данных я тестил
variable name1{value1,value2,value3}
variable name2 {value1, value2, value3}
variable name3  { value1,    value2,value3 }

и вот код на C#
static void Main(string[] args)
{
    Test("variable name1{value1,value2,value3}"); 
    Test("variable name2 {value1, value2, value3}"); 
    Test("variable name3  { value1,    value2,         value3 }"); 

    Console.ReadLine();
}

static private void Test(string input)
{
Regex regex = new Regex(@"variable\s+(?<name>[a-zA-Z_$][a-zA-Z0-9_$]*)\s*\{\s*(?<value>[^,\s]+)\s*(\,\s*(?<value>[^,\s]+)\s*)*\}", 
                        RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture | RegexOptions.Singleline);

Match m = regex.Matches(input)[0];

if(m.Success)
{
    StringBuilder res = new StringBuilder(input.Length);

    res.AppendFormat("variable {0} {{", m.Groups["name"].Value);

    CaptureCollection vals = m.Groups["value"].Captures;
    for(int i = 0; i < vals.Count; i++)
    {
        if(i == 0)                    
            res.Append(vals[i].Value);
        else
            res.AppendFormat(", {0}", vals[i].Value);
    }

    res.Append("}");

    Console.WriteLine("======================================");
    Console.WriteLine("Input: {0}", input);
    Console.WriteLine("Result: {0}", res.ToString());
    Console.WriteLine("======================================");
}
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.