RegExps:使用否定匹配以字符开头的单词

时间:2013-12-23 01:08:07

标签: regex bash grep regex-negation

尝试学习正则表达式。

在阅读this关于懒惰,贪婪和否定角色类的http://regular-expressions.info部分作为懒惰的替代方法之后,我试图自己使用它,但我无法弄清楚为什么以下是行不通的。

echo "hello world is this the way?" | grep -oE '\<w[^\>]+\>'

预期产出:

world
way

实际输出:

world is this the way

单词边界字符(\< \>)是否需要在字符类中进行特殊转义?

我只是在cli(bash 4.2.45,osx mavericks)上进行测试。这会是一个因素吗?

我知道\b也是一个单词边界字符,但如果我使用它,那么regexp就是这样:\bw[^\b]+\b,我得到相同的输出,但它包含问号。< / p>

谢谢!

更新

我正在寻找一个使用否定字符类的答案,以避免在替代懒惰下的here中解释正则表达式引擎中的回溯。如果不能使用否定的字符类,我正在寻找解释为什么。

2 个答案:

答案 0 :(得分:2)

由于单词边界通常由空格定义,为什么不使用

\<w[^[:space:]]+\>

如果您想要添加一个简单的w,您也可以使用

\<w[^[:space:]]*\>

答案 1 :(得分:1)

您可以使用此模式:

\bw\w+\b

这将捕获所有以w开头且由单词字符组成的单词。

使用否定时,您必须列出要排除的所有字符 - 而且我确定您要排除的不仅仅是字边界和问号。