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)' 不起作用?
最佳答案
\w+(?!abc\b)
pattern matches xxabc
因为\w+
贪婪地匹配 1 个或多个单词字符,从而抓取 xxabc
立刻。然后,负向前瞻 (?!abc\b)
确保没有abc
尾随字边界紧邻当前位置的左侧。自从之后xxabc
没有abc
如果带有尾随单词边界,则匹配成功。
匹配所有不以 abc
结尾的单词使用 PCRE 正则表达式,您可以使用
echo "xxabc jkl" | grep -onP '\b\w+\b(?<!abc)'
请参阅online demo
详细信息
-
\b
- 前导词边界 -
\w+
- 1 个或多个单词字符 -
\b
- 尾随单词边界 -
(?<!abc)
- 如果紧邻当前位置左侧的 3 个字母是abc
,则匹配失败的负向后查找。 .
关于regex - 匹配所有不以指定字符串结尾的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45635361/