Отрицательное выражение Lookbehind, которое не заканчивается на exp: '\w+(? <! Exp) \ b' или '\ w + \ b (? <! Exp)'

Для выражения (?<!foo),Negative Lookbehind, утверждает, что то, что непосредственно предшествует текущей позиции в строке, не является foo.
Теперь для сопоставления строки, не заканчивающейся символами abc,
Формальное выражение \w+(?<!abc)\b или же \b\w+(?<!abc)\b,

echo "xxabc jkl" | grep -oP  '\w+(?<!abc)\b'
jkl

Давайте попробуем другую форму: \w+\b(?<!abc),

echo "xxabc jkl" | grep -oP  '\w+\b(?<!abc)'
jkl

Это тоже дает правильный ответ.
По моему мнению, \w+\b(?<!abc) не отрицательный взгляд назад, ничего позади (?<!abc)не может называться отрицательным взглядом сзади.
1. это выражение \w+\b(?<!abc) отрицательный взгляд позади?
2.Why \w+\b(?<!abc) имеет тот же эффект, что и \w+(?<!abc)\b?

1 ответ

1) Это окно негативного просмотра. Отрицательный просмотр используется, если вы хотите сопоставить что-то, а не что-то еще.?<!abc это негативный взгляд за окном. Так что это будет верно только в том случае, если исходящие токены не являются "abc", что верно для строки: "xxabc jkl" технически, пространство продолжается "jkl" Поэтому это соответствует.

2) \b ищет слово границы. Границы слова применяются для пробелов и конца строк, которые присутствуют в обоих ваших регулярных выражениях. Если вы действительно хотите увидеть разницу, попробуйте убрать пробел. Так что используйте "xxabcjkl"

Другие вопросы по тегам