2010-08-11 87 views
4

我需要一个正则表达式的问题,帮助寻找的话:正则表达式,它们之间不仅是空间

我想找到的两个已知词(“foo”和“酒吧”为例)出现次数,那有什么除了它们之间的完全空格字符之外的空白空间。

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

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

到目前为止,我尝试过的一切都错过了一些组合,或者也匹配了唯一不应该匹配的单个空间案例。

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

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

回答

4

你也可以使用负前瞻:

foo(?! \b)\s+bar 

如果不支持lookahead,您可以直接写下:

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

表达式[^\S ]包括一个双重否定,它可能不会立即显而易见。如果你把它看作逻辑,它就意味着除空间以外的任何空白。

+0

这似乎工作。有趣的扭曲与非非空白的东西。前视也很好。 – selfawaresoup 2010-08-11 09:36:52

+0

我想,我会继续向前看。记住和阅读更容易。 – selfawaresoup 2010-08-11 09:41:09

1

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

foo[:space:]{2,}bar 

语法x{min,}意味着图案x必须出现至少min倍。


如果你的意思是除了0x20的空格字符“不是一个空格字符等”,你需要一个交替:

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

这两种错过那里有一个单一的标签,CR或LF高炮的单词的情况下。 – selfawaresoup 2010-08-11 09:30:02

+0

@Techpriester:交替解决方案应该可以工作,并且非常易读。 – polygenelubricants 2010-08-11 09:41:54

+0

不,像其他一些发布的解决方案一样,它忽略了单词之间存在单个“\ t”的情况。 – selfawaresoup 2010-08-11 16:32:35

0

使用[:空间:{2,}

{2,}表示2以上

+0

没有。例如,这会错过“foo \ tbar”。 – selfawaresoup 2010-08-11 09:31:06