echo "xxabc jkl" | grep -onP '\w+(?!abc\b)'
1:xxabc
1:jkl
为什么结果不如下?
echo "xxabc jkl" | grep -onP '\w+(?!abc\b)'
1:jkl
第一个字符串是xxabc
,以abc结尾
我想提取所有不以abc结尾的字符,为什么xxabc
匹配?
如何修复它,也就是说只获得1:jkl
作为输出?
为什么'\ w +(?!abc \ b)'不起作用?
答案 0 :(得分:1)
\w+(?!abc\b)
pattern matches xxabc
因为\w+
贪婪地匹配1个或多个单词字符,因此一次抓取xxabc
。然后,否定前瞻(?!abc\b)
确保在当前位置的左侧不存在具有尾随字边界的abc
。由于在xxabc
之后没有abc
带有尾随字边界,匹配会成功。
要使用PCRE正则表达式匹配所有不以abc
结尾的单词,您可以使用
echo "xxabc jkl" | grep -onP '\b\w+\b(?<!abc)'
请参阅online demo
<强>详情
\b
- 领先的单词边界\w+
- 一个或多个单词字符\b
- 尾随字边界(?<!abc)
- 如果当前位置左侧的3个字母为abc
,则会导致匹配失败的负面反馈。