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