Разборка текста посредством регулярных выражений - 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)}}}"); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д