2015-07-10 107 views
4

給定一個字符串"A B C a b B"我想匹配重複的單詞(無論大小寫)。預期結果將匹配「A」和「B」(A的最後出現和B)或「A」和「B」(第一事件)正則表達式積極lookbehind +負向lookahead

編輯:我只想匹配第一個或最後一個發生這個詞

我知道這個問題可以通過拆分字符串並計算每個令牌(降低該情況)來更好地回答。
但是,我想嘗試制定一個正則表達式來幫助我找到這些詞,只是爲了練習。

我的第一次嘗試是:(?=\b(\w+)\b.*\b(\1)\b)(\1)
但是它匹配第一個A,第一個B和第二個B(A B b)。

我想以某種方式使用正向後看負先行,以獲取重複單詞的最後一個實例:(?<=.*(?!.*(\w+).*)\1.*)\b\1\b
(在我的頭上是翻譯過來就是「那之前已經匹配,並榮獲」一個字再次匹配「)

那麼,它不適用於我不幸的。

是否可以使用積極的後視和負面預測這種方式?
我的正則表達式可以修復嗎?
我試着在C#中解決它。

這不是功課

回答

1

有趣的益智。這裏是我的解決方案:

(\b\w+\b)(?:(?=.*?\b\1\b)|(?<=\b\1\b.*?\1)) 

Demo

的理由如下:

  • 匹配一個單詞:(\b\w+\b)

  • 然後:(?: ...... | ... )

    • 確保它以後再次出現:(?=.*?\b\1\b)
    • 或之前就已經出現了:(?<=\b\1\b.*?\1)

      ,在回顧後第二\1剛之前匹配的詞匹配。第一個\1是真正的副本。


回答編輯的問題:

如果你只想匹配一個重複的字的第一次出現,我們可以改變上面的圖案有點:

(\b\w+\b)(?=.*?\b\1\b)(?<!\b\1\b.*?\1) 

Demo

現在的邏輯是:

  • 匹配一個單詞:(\b\w+\b)
  • 確保它再次出現:(?=.*?\b\1\b)
  • ,並確保它沒有發生之前:(?<!\b\1\b.*?\1)

    (不是一回事之前除了負面的後視)

+0

我想匹配重複單詞只有一次。我編輯了這個問題。抱歉。 –

+0

@nocgod沒問題,我擴大了答案 –

+0

@Lucas_Trezsniewski太棒了!我一直在移動這些部件,不知道爲什麼我沒有嘗試簡單的解決方案! –

相關問題