Разборка текста посредством регулярных выражений - C#

Узнай цену своей работы

Формулировка задачи:

Имеется текст такого вида:
  (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")
  )
....................
ЕщёБлаБлаБла
.....................
С помощью регулярных выражений собрать данные в примерно в таком виде: Nets("PPIN2")={{D4,194},{X5,3},{R18.1}} Nets("PPIN3")={{D4,199},{X5,5},{R36,1}} ..... и так далее.
То есть, надо окучить группы, начинающиеся со строк вида

(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)}}}");
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4.222 из 5
Похожие ответы