Запятая ломает группировку - PullRequest
2 голосов
/ 31 марта 2020

Мне нужно регулярное выражение, которое соответствует какому-либо параметру этой строки concat(1st,2nd) и извлекает три соответствующие группы, как показано ниже:

Group1 : concat

Group2 : 1-й

Group3 : 2nd.

Я пробовал это: ^\s*(concat)\(\s*(.*?)\s*\,\s*(.*)\)\s*$, и он работал нормально, пока у меня не было параметра с запятой как показано ниже:

concat(regex(3,4),regex(3,4)). Это шва запятая разбивает его, как игнорировать содержимое параметра и воспринимать его как отдельную группу?

1 Ответ

2 голосов
/ 31 марта 2020

Вы можете использовать

^\s*(concat)\(\s*((?>\w*\((?>[^()]+|(?<o>)\(|(?<-o>)\))*(?(o)(?!))\)|\w+))\s*,\s*((?>\w*\((?>[^()]+|(?<o>)\(|(?<-o>)\))*(?(o)(?!))\)|\w+))\)\s*$

См. Демоверсию regex .

Подробности

  • ^ - начало строки
  • \s* - 0+ пробелов
  • (concat) - Группа 1: concat word
  • \( - ( char
  • \s* - 0+ пробелов
  • ({arg}) - группа 2: arg шаблон:
    • \w* - 0+ слов символов
    • \((?>[^()]+|(?<o>)\(|(?<-o>)\))*(?(o)(?!))\) - (, затем любое количество вложенных скобок или символов, отличных от ( и ), а затем )
    • |\w+ - или просто 1+ слов символов
  • \s*,\s* - запятая, заключенная в 0+ пробелов
  • ({arg}) - Группа 3: arg pattern
  • \) - a ) char
  • \s* - 0+ пробелов
  • $ - конец строки.

См. C# demo :

var arg = @"(?>\w*\((?>[^()]+|(?<o>)\(|(?<-o>)\))*(?(o)(?!))\)|\w+)";
var pattern = $@"^\s*(concat)\(\s*({arg})\s*,\s*({arg})\)\s*$";
var match = Regex.Match("concat(regex(3,4),regex(3,4))", pattern);
if (match.Success) 
{
    Console.WriteLine(match.Groups[1].Value);
    Console.WriteLine(match.Groups[2].Value);
    Console.WriteLine(match.Groups[3].Value);
}
// => concat     regex(3,4)    regex(3,4)

Результаты:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...