У меня есть следующая строка: "text before AB000CD000CD text after"
. Я хочу сопоставить текст из AB с первым вхождением CD. Вдохновленный этим ответом, я создал следующий шаблон регулярного выражения:
AB((?!CD).)*CD
Я проверил результат в https://regex101.com/ и получил следующий результат:
Full match 12-19 `AB000CD`
Group 1. 16-17 `0`
Похоже, он делает то, что мне нужно. Однако я не понимаю, почему это работает. Насколько я понимаю, мой шаблон должен сначала соответствовать AB, затем любому символу, за которым не следует CD, а затем сам CD. Но следуя этой логике, результат не должен включать 000, а только 00, потому что за последним нулем на самом деле следует CD. Мое объяснение неверно?
AB((?:(?!CD).)*)CD
, группа захвата должна заключать внутреннюю группу квантификации кластера(?:(?!CD).)*
. Такой способ позволяет захватывать весь контент между AB и CD. - person   schedule 12.07.2017the result should not include 000, but only 00 because the last zero is actually followed by CD. Is my explanation wrong
Да, это неправильно. Скажем, текущая позиция здесь-›0CD
,0C != CD
, поэтому0
потребляется. Тогда это здесь-›CD
. ПосколькуCD == CD
это не удается, затем переходит к следующей части регулярного выражения, где оно соответствуетCD
. - person   schedule 12.07.2017