Разбить RegEx, соответствующий середине шаблона - PullRequest
1 голос
/ 20 сентября 2019

Я пишу RegEx, который соответствует нескольким терминам:

((a)|(b)|(c(1|2)))x

Я хочу, чтобы термины a и c1|2 совпадали только в том случае, если за ними следует x, но в b 'В этом случае я хочу немедленно прекратить сопоставление, игнорируя x в конце.

Простым решением было бы переместить b за пределы этого шаблона, но в моем случае у меня есть нескольковложенные уровни, что делает это невозможным.

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

1 Ответ

3 голосов
/ 20 сентября 2019

Вы можете использовать глагол управления возвратом (*ACCEPT):

(?:a|b(*ACCEPT)|c[12])x

См. perldoc perlre:

(*ACCEPT) (*ACCEPT:arg)

Этот шаблон ничего не сопоставляет и приводит к окончанию успешного сопоставления в точке, в которой был обнаружен шаблон (*ACCEPT), независимо от того, есть ли еще совпадение в строке.

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