【问题标题】:RegEx for finding words with NOT ONLY ONE space between themRegEx 用于查找它们之间不只有一个空格的单词
【发布时间】:2011-03-28 06:47:53
【问题描述】:

我需要有关 RegEx 问题的帮助:

我想找出两个已知单词(例如“foo”和“bar”)的出现次数,它们之间有除完全一个空格字符之外的任何空格。

在我必须 grep 的文本中,两个单词之间可能有空格、制表符、CR、LF 或它们的任意组合。

在正则表达式中: 我需要一个匹配"foo[ \t\n\r]+bar" 但不匹配"foo bar" 的正则表达式。

到目前为止,我尝试过的所有东西要么错过了一些组合,要么匹配了唯一不应该匹配的单空格大小写。

提前感谢任何解决方案。

编辑:澄清一下,我在这里使用 Perl 兼容的 RegEx。

【问题讨论】:

    标签: regex perl grep


    【解决方案1】:

    您也可以使用否定前瞻:

    foo(?! \b)\s+bar
    

    如果不支持前瞻,您可以显式编写:

    foo(?:[^\S ]| \s)\s*bar
    

    表达式[^\S ] 包含一个双重否定,它的工作原理可能不是很明显。如果你计算出它的逻辑,它意味着除了空格之外的任何空格。

    【讨论】:

    • 这似乎有效。有趣的转折与非非空白的东西。前瞻也不错。
    • 我想,我会选择前瞻。它更容易记住和阅读。
    【解决方案2】:

    你可以使用(假设 ERE,即grep -E

    foo[:space:]{2,}bar
    

    语法x{min,} 表示模式x 必须至少出现min 次。


    如果“除了一个空格字符”是指除了 0x20 空格字符之外,您需要一个替换:

    foo([\t\n\r]|[ \t\n\r]{2,})bar
    

    【讨论】:

    • 这两种情况都忽略了单词之间只有一个选项卡、CR 或 LF 的情况。
    • @Techpriester:替代解决方案应该可以工作,并且可读性很强。
    • 不,就像这里发布的其他一些解决方案一样,它错过了单词之间只有一个“\t”的情况。
    【解决方案3】:

    使用 [:space:]{2,}

    {2,} 表示 2 个或更多

    【讨论】:

    • 不。例如,这会错过“foo\tbar”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-20
    • 2016-06-10
    • 2014-12-21
    • 1970-01-01
    相关资源
    最近更新 更多