2015-04-16 126 views
6

我一直在玩這個表達式在Java中的年齡並不能得到它的工作:Java的正則表達式替換所有沒有替換所有單詞

(?:^|)(?:the|and|at|in|or|on|off|all|beside|under|over|next)(?: |$) 

以下:

pattern.matcher("the cat in the hat").replaceAll(" ") 

給我cat the hat。另一個示例輸入是the cat in of the next hat,它給我cat of next hat

有什麼辦法可以讓這個表達式更換工作,而不必打破他們出到多個獨立的正則表達式的每個字,並嘗試多次替換字符串?

回答

10

呀,你可以做到這一點很容易,你只需要使用boundaries,這是您想與來形容:(?:^|)只是這樣做,而不是:

\b(?:the|and|at|in|or|on|off|all|beside|under|over|next)\b 

你原來沒有捕獲,但在評論中提到的,如果你想捕捉的選項,你可以使用捕捉的,而不是一個非捕獲組:

\b(the|and|at|in|or|on|off|all|beside|under|over|next)\b 
+0

您可能還需要匹配組:'(\ b(?:| | | at | in |或| on | off | all | beside | under | over | next)\ b)' – frhd

+1

@frhd最好的解決方案就是簡單地用捕獲的組件取代非捕獲組:'\ b(the | and | at | in | or | on | off | all | beside | under | over | next)\ b' – sp00m

+0

@ sp00m是的,這個答案應該隨您的修正而更新。 – frhd

5

與你的問題是,在開頭和結尾的空格都包含在匹配和一個字符不能在兩場比賽中找到。

所以與輸入the_cat_in_the_hat(下劃線這裏更換空間,使說明更清晰):

  1. 首場比賽:the_,剩下的字符串:cat_in_the_hat
  2. 第二場比賽:_in_,剩下的字符串: the_hat
  3. the不匹配,因爲它既不是一個空間,也不由(原始)字符串的開始之前。

您也可以使用lookarounds代替,因爲它們表現得像條件(即if):

(?<=^|)(?:the|and|at|in|or|on|off|all|beside|under|over|next)(?= |$) 

Regular expression visualization

Debuggex Demo

這樣一來,你會:

  1. 首場比賽:the,剩下的字符串:_cat_in_the_hat
  2. 第二場比賽:in,剩下的字符串:_the_hat
  3. 第三場比賽:the,剩下的字符串:_hat

@JonathanMee answer是最好的解決方案,因爲字邊界是precisly實現此目的;)

+1

這是對問題的極好描述,我更喜歡我的最終解決方案,但+1因爲這使得更好的答案。 –

+2

尼斯,如果我能接受兩個答案,我會! – RTF

相關問題