2010-08-11 86 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