Как заставить отрицательный прогноз работать с текстом конца строки - PullRequest
5 голосов
/ 10 июня 2010

У меня есть регулярное выражение, подобное следующему:

.{0,1000}(?!(xa7|para(graf))$)

с использованием Java.Я ожидал, что это приведет к сбою следующего текста:

blaparagraf

, потому что в конце найден параграф

Ответы [ 2 ]

7 голосов
/ 10 июня 2010

Это потому, что .{0,1000} будет соответствовать всему предмету, поэтому за ним не следует xa7 или paragraf (за ним следует только $).

Вы хотите отрицательный взгляд сзади:

.{0,1000}(?<!xa7|paragraf)$
4 голосов
/ 10 июня 2010

Это распространенная ошибка - неправильно утверждать утверждения.Если вы хотите использовать lookahead, шаблон выглядит примерно так:

^(?!.*paragraph$).*$

Это соответствует ( как видно на rubular.com ):

something something para
paragraph something something

Ноне совпадает:

something paragraph

Таким образом, ключевое отличие здесь в том, что мы начинаем смотреть в начало строки, прежде чем мы сопоставим .* (или .{0,1000} втвой случай).Конечно, то, что мы ищем, это не просто paragraph$, а скорее .*paragraph$.

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

^.*$(?<!paragraph)
...