匹配所有不以指定字符串结尾的字符

时间:2017-08-11 12:33:01

标签: regex

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)'不起作用?

1 个答案:

答案 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,则会导致匹配失败的负面反馈。