Распарсить строку регулярным выражением
От: Deskny  
Дата: 30.12.10 14:45
Оценка:
Всем добрый вечер и с наступающим НГ!
Возникла проблема — распарсить строку регулярным выражением.
Я в них — ни бум-бум
строка вида:
string input1 = "header{group1{value1}group2{value2}group3{value3}}";
все элемены всегда присуствуют на своих местах. Внутри групп символы любые, кроме, естественно {}. Уровень вложенности — как видно — ограничен двумя, больше не планируется.
Выражение требуется распарсить таким образом, чтобы header попал в группу headerElement, group1,group2 и group3 -в группу groupElement, value1, value2, value3 — в группу valueElement.
навскидку получилось что-то вроде
string pattern1 = "(?<headerElement>.*?){((?<groupElement>.*?){(?<valueElement>.*?)})*}";
однако данный паттерн почему-то находит только одно вхождение группы — последнее (group3 и value3)

Может знатоки регулярных выражений подскажут?
regex регулярные выражения
Re: Распарсить строку регулярным выражением
От: Othello  
Дата: 30.12.10 19:44
Оценка: 2 (1)
Здравствуйте, Deskny, Вы писали:

D>Всем добрый вечер и с наступающим НГ!

D>Возникла проблема — распарсить строку регулярным выражением.
D>Я в них — ни бум-бум
D>строка вида:
D>string input1 = "header{group1{value1}group2{value2}group3{value3}}";
D>все элемены всегда присуствуют на своих местах. Внутри групп символы любые, кроме, естественно {}. Уровень вложенности — как видно — ограничен двумя, больше не планируется.
D>Выражение требуется распарсить таким образом, чтобы header попал в группу headerElement, group1,group2 и group3 -в группу groupElement, value1, value2, value3 — в группу valueElement.
D>навскидку получилось что-то вроде
D>string pattern1 = "(?<headerElement>.*?){((?<groupElement>.*?){(?<valueElement>.*?)})*}";
D>однако данный паттерн почему-то находит только одно вхождение группы — последнее (group3 и value3)

D>Может знатоки регулярных выражений подскажут?


А вам нужно именно регулярными?
            var s = "header{group1{value1}group2{value2}group3{value3}}";
            var a = s.Split(new char[] { '{', '}' }, StringSplitOptions.RemoveEmptyEntries);
            var header = a[0];
            for (int i = 1; i < a.Length; i += 2)
            {
                var gro = a[i];
                var val = a[i + 1];
                Console.WriteLine("group:{0} value:{1}", gro, val);
            } // for


зы.
регулярное выражение у вас в порядке (если не придираться)

зыы.
С наступающим
... << RSDN@Home 1.2.0 alpha 4 rev. 1270>>
Re: Распарсить строку регулярным выражением
От: out-of-the-way США www.tehnoromantik.net
Дата: 31.12.10 08:54
Оценка:
Здравствуйте, Deskny, Вы писали:

D>Всем добрый вечер и с наступающим НГ!

D>Возникла проблема — распарсить строку регулярным выражением.
D>Я в них — ни бум-бум
D>строка вида:
D>string input1 = "header{group1{value1}group2{value2}group3{value3}}";
D>все элемены всегда присуствуют на своих местах. Внутри групп символы любые, кроме, естественно {}. Уровень вложенности — как видно — ограничен двумя, больше не планируется.
D>Выражение требуется распарсить таким образом, чтобы header попал в группу headerElement, group1,group2 и group3 -в группу groupElement, value1, value2, value3 — в группу valueElement.
D>навскидку получилось что-то вроде
D>string pattern1 = "(?<headerElement>.*?){((?<groupElement>.*?){(?<valueElement>.*?)})*}";
D>однако данный паттерн почему-то находит только одно вхождение группы — последнее (group3 и value3)

D>Может знатоки регулярных выражений подскажут?


Дело в том, что если регекс находит несколько групп с одинаковым именем, то Groups["name"] возвращает последний найденную группу, получить все совпадения для найденной группы, можено через Groups["name"].Captures.


 var input="header{group1{value1}group2{value2}group3{value3}goup4{value4}}";
 var pattern="^[^{]+{([^{]+{[^}]+})+}$";
 var groupPatten="^(?<header>[^{]+){((?<group>[^{]+){(?<value>[^}]+)})+}$";
 var m=Regex.Match(input,groupPatten).Groups;

 Console.WriteLine(m["header"]);
 foreach(var i in m["group"].Captures) 
    Console.WriteLine(i);
 foreach(var i in m["value"].Captures) 
     Console.WriteLine(i);


Ну а так задача просто решается и без регексов.
Программа — мысли спрессованные в код.
Re[2]: Распарсить строку регулярным выражением
От: Deskny  
Дата: 11.01.11 09:25
Оценка:
Спасибо!
Задачу удалось решить последовательным применением двух простых регулярных выражений:
string pattern0 = "(?<headerElement>^.*?){";
string pattern1 = "(?<groupElement>[^{}]+){(?<valueElement>[^{}]+)}";

Однако вариант String.Split(...) работает намного быстрее, наверное, на нем и остановлюсь.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.