尝试学习正则表达式。
在阅读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中解释正则表达式引擎中的回溯。如果不能使用否定的字符类,我正在寻找解释为什么。
答案 0 :(得分:2)
由于单词边界通常由空格定义,为什么不使用
\<w[^[:space:]]+\>
如果您想要添加一个简单的w
,您也可以使用
\<w[^[:space:]]*\>
答案 1 :(得分:1)
您可以使用此模式:
\bw\w+\b
这将捕获所有以w
开头且由单词字符组成的单词。
使用否定时,您必须列出要排除的所有字符 - 而且我确定您要排除的不仅仅是字边界和问号。