Отрицательное выражение 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"