2013-12-23 48 views
0

尝试学习正则表达式。RegExps:使用否定匹配以字符开头的单词

在阅读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也是一个字的边界字符,但如果我使用它,所以正则表达式就像这样:\bw[^\b]+\b,我得到相同的输出,但它包含问号。

谢谢!

更新:

我正在寻找一个使用否定的字符类,以避免在正则表达式引擎回溯下另类的解释here懒惰答案。如果无法使用否定字符类,我正在寻找解释原因的解释。

回答

1

您可以使用此模式:

\bw\w+\b 

这将捕获所有开始w和组成的单词字符的话。

当使用否定时,您将不得不列出您想要排除的所有字符 - 并且我确定除了要排除的字边界和问号以外。

+0

没错,但我正在寻找一个使用负面字符类的答案,或者解释为什么在regular-expressions.info上使用负面字符类不起作用。 –

+0

但是,否定的问题是,你将不得不列出你想要排除的所有字符 - 而且我确定有多于你想排除的字边界和问号。 – Szymon

+0

也许我不明白否定。正则表达式引擎不会匹配并在匹配否定字符时返回匹配项吗? –

2

由于字边界通常是由白色空间中定义的,为什么不使用

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

如果你想包括一个简单的w你也可以使用

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

是的,这也适用。理解这一点的部分原因是否定类只意味着匹配不属于否定集的东西,并且知道单词的结尾有时候更好地由空白定义。 –

相关问题