2017-08-04 16 views
1

我的任務是創建一個正則表達式,我可以使用該正則表達式檢測多次出現的同一個單詞,並將其全部替換爲首次出現的單詞。如何讓Java在尊重單詞邊界的同時檢測反向引用?

我已經想出到目前爲止是:(\\b\\w+\\b)\\s{1}\\1

然而,這種檢測例如第二個horsehorse horseracing。我只想檢測完全匹配,即我希望我提供的單詞邊界得到尊重。我想,(\\b\\w+\\b)\\s{1}\\1似乎是\\b(\\w+)\\b\\s{1}\\1

一些示例替換:

Goodbye bye bye world world world - >Goodbye bye world
Sam went went to to to his business - >Sam went to his business
​​- >Reya is the best player in eye game

三個以上工作正常,但是:

in inthe變得inthe代替in inthe 。我應該修改什麼,以便尊重單詞邊界?

enter image description here

回答

1

重複的字邊界:

"\\b(\\w+)\\s\\1\\b" 
       ^^^ 

\b(\w+)\s\1\b regex demo

僅僅將字邊界模式置於捕獲組內的事實並不意味着將字邊界語義與反向引用一起傳遞。反向引用只存儲所捕獲的文本值,而不是它在匹配的上下文

此外,一些字邊界存在於圖案隱含:\w+\s\s\1(間之間的空白是一個非-word char)。因此,您只需在前面輸入\b,然後在模式結尾輸入\b