查找具有不止一个空格的单词的正则表达式

4

我需要在正则表达式中解决一个问题:

我想要查找已知的两个单词(例如 "foo" 和 "bar"),它们之间除了恰好一个空格字符以外,还有任何其他的空白字符。

在我要使用 grep 命令搜索的文本中,可能存在空格、制表符、回车符、换行符或它们的任意组合。

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

到目前为止,我尝试过的所有方法都有遗漏一些组合或者也匹配了只有一个空格的情况,而这种情况是唯一不应该匹配的。

感谢您提供任何解决方案。

编辑说明:为了澄清,我在这里使用 Perl 兼容的正则表达式。

3个回答

4

您还可以使用负向先行断言:

foo(?! \b)\s+bar

如果不支持向前查看,您可以明确地编写它:
foo(?:[^\S ]| \s)\s*bar

表达式[^\S ]包含了双重否定,可能不太容易理解它的工作原理。如果你推导出它的逻辑,它的意思是除了空格以外的任何空白字符。

这似乎有效。非空白字符的否定是一个有趣的变化。预查也很好用。 - selfawaresoup
我认为,我会选择前瞻。它更容易记忆和阅读。 - selfawaresoup

1
您可以使用(假定为ERE,即grep -E
foo[:space:]{2,}bar

x{min,} 的语法意思是模式 x 必须至少出现 min 次。


如果你说“除了一个空格字符以外”,意思是除了0x20的空格字符,那么你需要使用替换:
foo([\t\n\r]|[ \t\n\r]{2,})bar

这两种情况都无法处理单个制表符、回车或换行符在单词之间的情况。 - selfawaresoup
@Techpriester:交替方案应该可行,而且非常易读。 - polygenelubricants
不,与其他发布的解决方案不同,它忽略了单词之间只有一个"\t"的情况。 - selfawaresoup

0

使用[:space:]{2,}

{2,}表示2个或更多


不行。这会错过例如 "foo\tbar" 的情况。 - selfawaresoup

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接