【问题标题】:RegExps: Match a word that starts with a character using negationRegExps:使用否定匹配以字符开头的单词
【发布时间】:2013-12-23 01:08:07
【问题描述】:

尝试学习正则表达式。

在阅读了http://regular-expressions.info 上关于懒惰、贪婪和否定字符类作为懒惰替代品的this 部分后,我尝试自己使用它,但我不明白为什么以下内容不会工作。

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

预期输出:

world
way

实际输出:

world is this the way

字边界字符 (\&lt; \&gt;) 需要在字符类中进行特殊转义吗?

出于测试目的,我只是在 cli(bash 4.2.45,osx mavericks)上执行此操作。这会是一个因素吗?

我知道\b 也是一个字边界字符,但如果我使用它,所以正则表达式是这样的:\bw[^\b]+\b,我得到相同的输出,但它包含问号。

谢谢!

更新:

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

【问题讨论】:

    标签: regex bash grep regex-negation


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 是的,这也有效。对此的部分理解是,否定类只是意味着匹配不属于否定集的内容,而且知道有时用空格更好地定义词尾。
    【解决方案2】:

    你可以使用这个模式:

    \bw\w+\b
    

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

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

    【讨论】:

    • 是的,但我正在寻找一个使用否定字符类的答案,或者解释为什么使用像 regular-expressions.info 这样的否定字符类不起作用。
    • 否定的问题在于,您必须列出所有要排除的字符 - 我敢肯定,您要排除的不仅仅是单词边界和问号。
    • 那我可能还不懂否定。正则表达式引擎在遇到否定字符时不会停止匹配并返回匹配项吗?
    • 啊,所以它只是跳过了词尾字符并继续匹配?
    • 是的。否定意味着:任何不在列表中的字符都匹配。然后它会继续匹配其余部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-10
    • 1970-01-01
    • 2010-11-17
    • 2015-12-26
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    相关资源
    最近更新 更多