2015-02-21 5 views
2

Может кто-нибудь объяснить мне, почему картина (отрицательный предпросмотр)Положительные и отрицательные lookaheads и кванторы

/aa.+(?!cc)/g 

матчи все 4 линии

 
aabbcc 
aabb 
aabbcc 
aabb 
 

в то время как я ожидал бы только 2 следующие строки будут совпадений:

 
aabbcc 
aabb 
aabbcc 
aabb 

картина (положительная опережения):

/aa.+(?=cc)/g 

соответствует только 2 строки:

 
aabbcc 
aabb 
aabbcc 
aabb 

как я бы предположить?

Я использую двигатель RegEx от PCRE.

+0

Чтобы лучше понять [посмотреть, какие позиции соответствуют (?! Cc)] (https://regex101.com/r/xB8gC5/1) –

ответ

2

Потому что .+ в этом шаблоне aa.+(?!cc) соответствует всем символам до конца. Поскольку после последнего нет строки cc, это регулярное выражение соответствует всем приведенным выше строкам.

aa(?!.*cc).+ 

Изменить ваше регулярное выражение, как указано выше, в соответствии со второй и четвертой строкой. (?!.*cc) отрицательный lookahead утверждает, что не будет строки cc, присутствующей на следующей строке, которая будет сопоставлена ​​с использованием шаблона .+.

DEMO

+0

Вы объясните: «Потому что + в этом шаблоне aa. + (?! cc) соответствует всем символам до конца. Так как после последнего нет строки cc, это регулярное выражение соответствует всем вышеперечисленным строкам. " для меня смысл, но исходя из этой логики, почему мой второй пример с положительным взглядом работает (мы сопоставляем все символы до конца, и поскольку после окончания строки, соответствующей cc fials, нет символов)? – Mulligan1981

+0

@ user3925126 Обратите внимание, что regex engine всегда пытается найти совпадение. Итак, в первом 'aa. + (?! cc)', он получил совпадение в конце строки. Таким образом, он печатает эти согласованные строки, где «aa. + (? = Cc)» соответствует всем символам до последнего, так как после последнего нет строки 'cc', механизм regex обращается в порядке найти матч. Таким образом, сначала он возвращается к одному символу и проверяет соответствие, за которым следует 'cc', то есть он соответствует' aabbc' и проверяет наличие cc после этого совпадения. –

+0

Поскольку есть только один 'c' подарок, он возвращается назад еще раз. Теперь он соответствует 'aabb', и есть совпадение, потому что за' aabb' следует 'cc' –

3

Правильный отрицательный предпросмотр регулярное выражение:

/^aa((?!cc).)+$/gm 

RegEx Demo

Это будет соответствовать что-нибудь после того, как aa до тех пор, пока не cc до конца строки.

Смежные вопросы