Разборка текста посредством регулярных выражений - C#
Формулировка задачи:
Имеется текст такого вида:
С помощью регулярных выражений собрать данные в примерно в таком виде:
Nets("PPIN2")={{D4,194},{X5,3},{R18.1}}
Nets("PPIN3")={{D4,199},{X5,5},{R36,1}}
.....
и так далее.
(compInst "XC00160"
(compRef "O003_1")
(originalName "O003")
(attr "FP" "O003" (pt -2.75 -2.0) (textStyleRef "T:H78W7") )
)
(compInst "XC00161"
(compRef "O003_1")
(originalName "O003")
(attr "FP" "O003" (pt -2.75 -2.0) (textStyleRef "T:H78W7") )
)
(compInst "XC00162"
(compRef "O003_1")
(originalName "O003")
(attr "FP" "O003" (pt -2.75 -2.0) (textStyleRef "T:H78W7") )
)
.................................
БлаБлаБла
................................
//Начинать отсюда
(net "PPIN2"
(node "D4" "194")
(node "X5" "3")
(node "R18" "1")
)
(net "PPIN3"
(node "D4" "199")
(node "X5" "5")
(node "R36" "1")
)
(net "NPIN2"
(node "D4" "195")
(node "X5" "22")
(node "R18" "2")
)
(net "PPIN4"
(node "D4" "223")
(node "X5" "7")
(node "R38" "1")
)
(net "NPIN3"
(node "D4" "200")
(node "X5" "24")
(node "R36" "2")
)
....................
ЕщёБлаБлаБла
.....................
То есть, надо окучить группы, начинающиеся со строк вида
(net "
и кончающиеся последней закрывающей скобкой.
Хорошо, упрощу задачу.
Как собрать все группы строк, где первая строка имеет начало «
(net
» а в конце группы подряд две закрывающие скобки без каких-либо значащих символов. Допустим, я выкину из исходного текста все пробелы и переводы строк. Тогда отлавливаем все фрагменты, начинающиеся на «(net
» и заканчивающиеся на «))
». "Заголовки" удалось отловить без труда, а вот как в шаблоне указать, что конец должен быть «))
»?Решение задачи: «Разборка текста посредством регулярных выражений»
textual
Листинг программы
var text = File.ReadAllText(@"p:\input.txt");
var pattern = @"
(?<=net \s+ ""(?<netname>\w+)"" .*?)
\(node \s+ ""(?<name>\w+)"" \s+ ""(?<value>\w+)"" \s*\)";
var Nets = Regex
.Matches(text, pattern, RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace)
.Cast<Match>()
.GroupBy(net => net.Groups["netname"].Value)
.ToDictionary(
g => g.Key,
g => g.Select(node => new /* какая-то структура */
{
Name = node.Groups["name"].Value,
Value = node.Groups["value"].Value
}).ToList()
);
// Nets["NPIN2"][0].Value = ...
foreach (var pair in Nets)
{
Console.WriteLine($@"Nets(""{pair.Key}"") = {{{string.Join(", ", pair.Value)}}}");
}