Не могу найти соответствующий шаблон в регулярном выражении, используя OR - PullRequest
0 голосов
/ 19 февраля 2020

Вот мое регулярное выражение:

(M|D|MD|A|AM|AD|AMD)?=(0|1|-1|D|A|!D|!A|-D|-A|D\+A)?

Соответствует

M=D 
M=A
M=1 
and so on

, но не соответствует

M=D+A

что я здесь не так делаю?

Ответы [ 2 ]

2 голосов
/ 19 февраля 2020

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

(M|D|MD|A|AM|AD|AMD)?=(D\+A|0|1|-1|D|A|!D|!A|-D|-A)?

поможет. Другими словами, всегда упорядочивайте свои операторы «или» таким образом, чтобы вы сначала захватывали более длинные строки, а затем - более короткие.

демо

0 голосов
/ 19 февраля 2020

Вам нужен квантификатор для группы, как в:

(M|D|MD|A|AM|AD|AMD)?=((?:\+A|0|1|-1|D|A|!D|!A|-D|-A)+)
#                      ^^^                          ^^^

См. демонстрацию на regex101.com .


В зависимости от Ваши реальные потребности, более простое регулярное выражение, такое как (\w+)=([-+!\w]+), и последующая программная проверка может быть легче для понимания.
См. пример для последнего на regex101.com .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...