Всем добрый вечер и с наступающим НГ!
Возникла проблема — распарсить строку регулярным выражением.
Я в них — ни бум-бум
строка вида:
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)
Может знатоки регулярных выражений подскажут?
Здравствуйте, 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>>
Здравствуйте, 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);
Ну а так задача просто решается и без регексов.