2011-11-18 56 views
10

我對RegEx表達式很恐怖,而且我經常不足以讓我記住兩次使用之間的語法。當字符串出現兩次時匹配的正則表達式

我正在使用grepWin來搜索我的文件。我需要做一個搜索,將返回給定字符串兩次的文件

因此,舉例來說,如果我是對單詞搜索「如何做」,那麼文件中的一個不匹配:

你好
今天你怎麼樣?

,但文件中的兩個會:

你好
今天你怎麼樣?

我很好,你好嗎?

任何人都知道如何製作RegEx來匹配它?

+1

如果搜索字符串必須是變量,那麼使用正則表達式是不可能的。您需要將其與腳本語言結合使用。如果它不需要變量,那麼這個正則表達式就會這樣做:'你好嗎?*你好嗎? – Jeff

+1

@Jeff可以在JavaScript正則表達式中返回匹配的組:'/(abc)\ 1 /'匹配'abcabc',但不匹配'abc'。 –

+0

只有當「how」出現兩次時才必須匹配?如果出現三次或更多次,該怎麼辦? – Wiseguy

回答

13

這樣的事情(取決於語言和特定的任務)

\(how.*){2}\ 

編輯:根據@CodeJockey

\^(([^h]|h[^o]|ho[^w])*how([^h]|h[^o]|ho[^w])*){2,2}$\ 

(它變得更加複雜) @CodeJockey :謝謝徵求意見

+3

這將得到兩次或更多次'how'的文件,但不會**排除**發生三次或更多次的文件 –

+0

是的,你是對的 – VMykyt

+1

@CodeJockey我也是這樣讀的。我想知道提問者是否意味着_exactly_兩次。 – Wiseguy

1

這比我原先想象的要困難得多這將是,需要可變長度的回顧後,這grepWin不支持......

這個表達式:

(?<!blah.{0,99999})blah(?=.*?blah)(?!.*blah.*blah) 

在Eclipse中成功使用,使用「搜索>文件」對話框中排除的文件包含一個和三個blah實例,幷包含具有兩個blah兩個實例的文件。

Eclipse不允許.*倒在後面,所以我用.{0,99999}代替。

使用正確的工具是可能的,但讓它與grepWin一起工作並不美妙(參見上面的答案)。您可以使用其他工具(如Eclipse)以及之後您想對文件做什麼?

+0

如果lookbehinds是一個問題,我只用瞭望遠鏡。 – Wiseguy

+0

是的 - 一旦我在要求的產品中測試@ VMykyt的解決方案並且它工作(尤其是沒有OP的任何明顯的興趣),我一直沒有打擾過。當我最初開展工作時,我的大腦不知何故暫時失去了開始行或字符串錨點的想法,這應該使它不可能沒有後視:D –

+0

@Wiseguy我喜歡你的解決方案使用整體但儘管如此,儘管不會太難添加,但沒有人說明OP可能希望只匹配具有兩個實例的文件,但允許「榴彈炮」或「以某種方式」,甚至「淋浴」任何次數 –

4

我不知道grepWin支持什麼,但是這裏是我想出來的東西,讓它匹配兩次。

/^((?!how).)*how((?!how).)*how((?!how).)*$/ 

說明:

/^    # start of subject 
    ((?!how).)* # any text that does not contain "how" 
    how   # the word "how" 
    ((?!how).)* # any text that does not contain "how" 
    how   # the word "how" 
    ((?!how).)* # any text that does not contain "how" 
$/    # end of subject 

這可以確保您發現兩個「如何」 S,而是「如何」之間的文本,要麼他們一邊不包含「如何」。

當然,您可以用任何字符串替換表達式中的「how」。


如果你想只寫搜索表達式 「簡化」 了兩次,你可以這樣使用反向引用:

/^(?:(?!how).)*(how)(?:(?!\1).)*\1(?:(?!\1).)*$/ 

Refiddle with this expression

說明:
我加?:,使負面看法'的文字無法捕捉。然後我在常規的how周圍添加了括號,以便創建一個捕獲子模式(第一個也是唯一一個)。

我必須在第一個預見中再次包含「how」,因爲這是一個負向預測(意味着任何捕獲將不會包含「how」),並且捕獲的「how」在此時尚未捕獲。

相關問題