Как я могу поместить шаблон регулярного выражения в другой шаблон регулярного выражения, не имея несоответствий - PullRequest
0 голосов
/ 18 апреля 2020

Вот мой шаблон регулярных выражений (без пробелов atm):

(method)\((.*?),(.*?)\)|(print)\((.*?)\)

И результат всегда возвращает:

"method(a,print(hello world)"

вместо:

"method(a,print(hello world))"

Как я могу захватить все, сохраняя при этом внешние скобки?

1 Ответ

2 голосов
/ 18 апреля 2020

При этом используется специальная конструкция, называемая балансирующими группами, для достижения рекурсивности и захвата более одного уровня вложенности в методе, если это потребуется. Захваченные команды размещаются внутри группы «команды»

var regex = new Regex(@"method
[(]
(?<action>\w+)\s*,\s*
(\s*
    (?<commands>\w+
    (;|
        ((?<open>[(])[^(]*?)+
        (?<close-open>[)])+
        (?(open)(?!))
    ))+
\s*)+
[)]", RegexOptions.IgnoreWhitespace | RegexOptions.ExplicitCapture);

Здесь есть постоянная ссылка для регулярного выражения. Если вы посмотрите туда, то увидите следующую таблицу:

enter image description here

Как видно здесь, регулярное выражение совпало с 4 командами во втором Строка, в которой действие a, для получения этих результатов вы можете сделать regex.Match(foo).Groups["commands"].Captures.Select(c => c.Value)

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