2014-11-28 2 views
0

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

hello bob 
hello my name is bob 

Я пытаюсь соответствовать hello bob с использованием отрицательного предпросмотра. Регулярное выражение hello.*(?!my name is).*bob соответствует обеим линиям. Регулярное выражение hello .*(?!my name is) .*bob соответствует второй строке.

Как я могу совместить только первую строку, и почему на самом деле отрицательный взгляд соответствует линии, с которой он не должен совпадать? Что я делаю не так?

ответ

1

Жадный .* перед отрицательным взглядом - это то, что удерживает его от правильной работы. Это делает матч, который вы ищете:

/hello (?!my name is).*bob/ 

В качестве альтернативы, вы можете поставить .* в отрицательное утверждение непосредственно:

/hello(?!.*my name is).*bob/ 

Это будет держать два из конкурирующих.

+0

Спасибо, это работает. Можете ли вы объяснить, почему. * Жадный до того, как негативный взгляд заставил его сломаться? – jrahhali

+0

Ваше оригинальное регулярное выражение говорит: «Я хочу« привет », за которым следует что-либо, а не« мое имя », за которым следует что-нибудь, а затем« bob ». В этом случае вы получаете« привет », за которым следует что-то - все, что есть «мое имя». После этого нет «моего имени», так что вы получите матч. –

1

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

^hello bob$ 

Используя начало якоря (^) и конец строки якоря ($), только hello bob будет удовлетворять этому регулярному выражению.

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