Я создал и протестировал этот Regexpattern <\w\w:Value> SYMBOL: (P.*)=(.*)\/\/(.*)

 Regex regexPattern = new Regex(@"<\w\w:Value> SYMBOL: (P.*)=(.*)\/\/(.*)");
 var attributeChecker = regexPattern.Match(line);
 var attributeLongDescription = attributeChecker.Groups[3].ToString().Trim();

Вот модель:

<AC:Value> SYMBOL: PDWFNA     = 0;        // Projektierung D-Weg Freimeldung nicht
                                          // auswerten
<AC:Value> SYMBOL: PDWLE      = 0;        // Länge des Durchrutschweges

Результаты, которые я получаю от третьей группы:

Projektierung D-Weg Freimeldung nicht
Länge des Durchrutschweges

Как я могу получить эти результаты из третьей группы:

Projektierung D-Weg Freimeldung nicht auswerten
Länge des Durchrutschweges
2
kn1ghtx 15 Окт 2021 в 15:23

1 ответ

Лучший ответ

Вы не можете захватить непересекающиеся части строки в одну группу захвата. Вам нужно сопоставить все строки под шаблоном, которые являются продолжением комментария, а затем обработать результат.

Вы можете использовать следующий подход (см. демонстрацию C #):

var text = @"<AC:Value> SYMBOL: PDWFNA     = 0;        // Projektierung D-Weg Freimeldung nicht
                                          // auswerten
<AC:Value> SYMBOL: PDWLE      = 0;        // Länge des Durchrutschweges";
var matches = Regex.Matches(text, @"<\w{2}:Value> SYMBOL: (P.*)=(.*)//(.*(?:\n[\s-[\r\n]]*//.*)*)");
foreach (Match m in matches) 
{
    Console.WriteLine("--- A new match ---");
    Console.WriteLine($"Group 1: {m.Groups[1].Value}");
    Console.WriteLine($"Group 2: {m.Groups[2].Value}");
    Console.WriteLine("Group 3: {0}",
        string.Join(" ", 
            m.Groups[3].Value.Split(new[] {"//"}, StringSplitOptions.RemoveEmptyEntries)
                .Select(x => x.Trim())
        )
    );
}

Выход:

--- A new match ---
Group 1: PDWFNA     
Group 2:  0;        
Group 3: Projektierung D-Weg Freimeldung nicht auswerten
--- A new match ---
Group 1: PDWLE      
Group 2:  0;        
Group 3: Länge des Durchrutschweges

См. Также regex demo.

Часть (.*(?:\n[\s-[\r\n]]*//.*)*) захватывает в Группу 3 остальную часть текущей строки с помощью .*, затем любые ноль или более строк, которые могут начинаться с нуля или более пробелов, кроме CR и LF, затем имеют // а затем что угодно до конца строки.

string.Join(" ", m.Groups[3].Value.Split(new[] {"//"}, StringSplitOptions.RemoveEmptyEntries).Select(x => x.Trim())) - это один из способов постобработки значения Группы 3. Здесь он разбивается на подстроку //, а затем все результирующие элементы удаляются из начальных / конечных пробелов, а затем они объединяются в одну строку с пробелом.

Вы также можете использовать Regex.Replace(m.Groups[3].Value, @"\s*//\s*", " ") вместо этого, чтобы сделать его короче.

1
Wiktor Stribiżew 15 Окт 2021 в 12:46