2016-04-19 8 views
1

Что такое различие между:Отрицательный Lookahead для Regex

^(?!.*baa)[abc]*$ 

и

^(?!baa)[abc]*$ 

Какова роль этого .*. Я знаю, что это означает любой символ 0 или более раз, но почему второй захватывает строки, такие как cccaabaa, которые следует отбросить?

ответ

1

Разница между ними:

  1. ^(?!.*baa) требует, чтобы baa не быть где-нибудь на входе
  2. ^(?!baa) требует, чтобы baa не быть старте входа

.* позволяет что-либо быть между стартом ^ и baa.

+0

спасибо. следуя этим соображениям, почему нам не нужно добавлять '. *' после того, как мы можем сказать, что это не добавляет конец ввода, как в '^ (?!. * baa *.) [abc] * $' – ocram

+1

@ocram yes - '. *' После 'baa' не имеет значения. Если вы хотите запретить 'baa' где-либо * кроме * использовать конец'^(?!. * Baa.) ', Что требует наличия (по крайней мере) еще одного символа после' baa' – Bohemian

0

^[а] * $ (* б?!.) - Запускают от текущей позиции (здесь начали из-за ^), потребляют всю строку, а затем откатывается, чтобы найти, если есть нет baa где-нибудь в строка. Теперь позиция, из которой матч начался опережающий просмотр (здесь начало) проверить все, что следует, является combiantion из a, b и c

enter image description here

^(?! беи) [а] * $ - Начинается с текущей позиции (здесь, начиная с ^), чтобы проверить, что следует не baa. baa может быть в любом месте, но не в начале.

enter image description here

0

(?! ) является отрицательным опережением: она определяет группу, которая не может сравниться.

В ^(?!baa)[abc]*$ вы ищете строку, которая не начинается с «baa» и имеет только символы в формате b или c: cccaabaa: он не начинается с «baa».

В ^(?!.*baa)[abc]*$, вы ищете строку, которая начинается не с чем подчиняющегося BAA, и имеют только символы из аб или с: cccaabaa не совпадает, потому что она начинается с «cccaa подчиняющегося BAA»

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

  • Нет связанных вопросов^_^