Избегайте балансировки регулярных выражений, чтобы выйти из скобок - PullRequest
2 голосов
/ 20 апреля 2020

Я использую следующее регулярное выражение для сопоставления содержимого любого сценария сценария данных, ссылающегося на указанный c UDF:

\[?shared3\]?\.\[?stringsum\]?(((?'Open'\()[^()]*)+((?'Close-Open'\))[^()]*)+)*

, который соответствует любому экземпляру:

Shared3.StringSum(<some contents here>)

Используя группы балансировки, я пытаюсь также поддерживать такие случаи, как:

Shared3.StringSum(SomeOtherMethod('input') + AnotherMethod('input'))

Однако у меня возникают проблемы, когда ввод имеет вид:

Shared3.StringSum(SomeOtherMethod('input') + AnotherMethod('input')) + ThirdMethod('input')

В В последнем случае мое регулярное выражение также соответствует части ThirdMethod('input').

Можно ли каким-либо образом изменить свое регулярное выражение, чтобы оно перестало совпадать, как только "количество скобок" станет равным 0?

1 Ответ

3 голосов
/ 20 апреля 2020

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

\[?shared3]?\.\[?stringsum]?\(((?>[^()]+|(?'Open'\()|(?'Close-Open'\)))*)\)

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

Подробности

  • \[?shared3]? - необязательный [, shared и необязательный ]
  • \. - точка
  • \[?stringsum]? - an optional [, stringsum , and an optional] `
  • \( - a (
  • ((?>[^()]+|(?'Open'\()|(?'Close-Open'\)))*) - Группа 1: одно или несколько вхождений
    • [^()]+| - 1+ символов, отличных от ( и ) или
    • (?'Open'\()| - группа «Открыть»: помещает ( в групповой стек
    • (?'Close-Open'\)) - Группа «Закрыть» и «Открыть»: отображает ) из Open группового стека и сохраняет подстроку текущего уровня в Close группу
  • \) - от ) char до fini sh вещи вверх
...