2012-06-17 86 views
0

我只是試圖(徒勞)在循環中刪除單詞'at'的所有實例。模式匹配器replaceAll

Pattern atPattern = Pattern.compile(".*\\bat\\b.*"); 
String input = "at Pat's attic a fat cat catcher at patted at" 

// required output "Pat's attic a fat cat catcher patted" 

output = input.replace(atPattern.pattern(), " "); 

output= input.replaceAll(".*\\bat\\b.*", " "); 

Matcher atMatcher = atPattern.matcher(input); 

output = atMatcher.replaceAll(" "); 

// Starting to clutch at straws now... 

Matcher atMatcher = Pattern.compile(".*\\bat\\b.*").matcher(input); 

output = atMatcher.matcher(input).replaceAll(" "); 

output = atPattern.matcher(input).replaceAll(" "); 

我已經試過上述太多的許多其他組合,但我不能得到我想要的輸出...

請你可以把我趕出痛苦..

回答

2

replaceAll(...)就足夠了,你就需要這樣at的後除去一些可選空間:

String input = "at Pat's attic a fat cat catcher at patted at"; 
String expected = "Pat's attic a fat cat catcher patted"; 

System.out.println(input.replaceAll("\\bat\\b\\s*", "").trim()); 
System.out.println(expected.trim()); 

上面會打印:

Pat's attic a fat cat catcher patted 
Pat's attic a fat cat catcher patted 
+0

在你的輸出的第一行中實際上有一個尾部空格 – nhahtdh

+0

@nhahtdh,啊是的,一個簡單的'trim()'將補救:) –

+0

這個答案在我所有的隨機字符串中給出了正確的結果。謝謝。我可以使用.trim()來清除任何空格。我會回來,並將其標記爲正確的,除非有某種更好的反應! – brandall

1

它可以簡單地這樣做:

"at Pat's attic a fat cat catcher at patted at" 
    .replaceAll("\\bat\\b","").trim().replaceAll(" +", " ") 

trim()和第二replaceAll()是爲去掉空格。

可能有其他方法可以在一個步驟中完成所有這些操作(可能更快?),但將它們分開更容易考慮邏輯。

EDIT

以防萬一,這是一個單步驟解決方案:

.replaceAll("(?i)(\\bat\\b | ?\\bat\\b)","") 

(?i)加入爲不區分大小寫。如果你不需要,你可以刪除它。

+0

謝謝!使用.replaceAll(「(\\ bat \\ b | \\ bat \\ b)」,「」)返回'at'時,String非常好用。 – brandall

+0

@andjav:沒想到這種情況。郵政將很快進行編輯。 – nhahtdh

+0

謝謝。 Bart Kiers的答案使用s *。你的答案使用? 。你認爲理想答案是否同時使用? – brandall

1

你可以這樣做

.replaceAll("(\\s|^)(at)(\\s|$)", " ").trim() 
+0

這次「at」在「閣樓」被吃掉了。 – nhahtdh

+0

@nhahtdh是的,我修好了。 – plucury

+0

實際上,OP使用字邊界'\ b'的想法很好,即使「at」在前/後有逗號/句號,它也會清理「at」。 – nhahtdh