Предотвращение сопоставления регулярных выражений с использованием отрицательного взгляда - PullRequest
0 голосов
/ 24 мая 2019

У меня есть пример регулярного выражения, с которым я работаю, и я не понимаю, почему отрицательный взгляд не мешает совпадениям.

С этим выражением ^((?<!foo)[a-z]+ ?)+$ Я ожидаю, что следующая строка не будет соответствовать bar foobar baz, так как есть строка foo, а затем несколько букв после нее.

Даже просто foobar матчей, которых я бы точно не ожидал. Я знаю, что это связано с + после совпадений [a-z].

^((?<!foo)[a-z] ?)+$ соответствует fob, но не foob, что я и ожидал.

Что мне нужно изменить, чтобы строка bar foobar baz не соответствовала?

1 Ответ

2 голосов
/ 24 мая 2019

Вы уже знаете, что вам нужно сбросить это + с [a-z]+, чтобы получить ожидаемые результаты. Но вы можете спросить, почему? См. Следующие поведения.

с [a-z]+, этот взгляд позади начинает утверждать в следующих позициях:

 bar foobar baz
 ^   ^      ^  ^

но с [a-z] оно отличается:

 bar foobar baz
 ^^^ ^^^^^^ ^^^^
        ^

Как видите, в первой форме (?<!foo) проходит, потому что всем этим 4 позициям не предшествует foo, но во второй форме он прекращает совпадение сразу после второй o, потому что есть foo предшествующий b.

...