2010-01-12 56 views
24

我正在尋找在Java中查找和替換字符串的最佳方法。Java查找和替換字符串的最佳方法是什麼?

這是一句話:「我的名字是米蘭,人們認識我爲米蘭瓦西奇」。

我想用米蘭瓦西奇替換米蘭的米蘭,但是在我已經有米蘭瓦西奇的地方,那不應該是個案。

搜索/替換結果應該是:「我的名字是米蘭瓦西奇,人們認識我爲米蘭瓦西奇」。

我試圖使用indexOf()和模式/匹配器組合,但我的結果都不看起來優雅,有人有優雅的解決方案嗎?

乾杯!

+1

在這種情況下米蘭班迪奇呢?讓我們在同一句話中有一個米蘭瓦西奇和一個米蘭班迪奇,那麼第一個米蘭將會忽略系統,第二個將會是米蘭瓦西奇Bandic? :) –

+0

heheeh ...我用這個例子的名字:) – vaske

回答

41

那麼,你可以使用一個regular expression找到其中「米蘭」後面沒有「瓦西奇」的情況:

Milan(?! Vasic) 

並更換由全名:

String.replaceAll("Milan(?! Vasic)", "Milan Vasic") 

(?!...)部分是一個negative lookahead,它確保任何匹配沒有被括號中的部分跟隨。它不會消耗比賽本身中的任何字符。

或者,您可以簡單地插入(在技術上取代零寬度匹配)姓氏後面的姓氏,除非後面跟着姓氏。這看起來相似,但採用的是positive lookbehind還有:

(?<=Milan)(?! Vasic) 

您可以通過只" Vasic"替換此(注意在字符串的開頭空格):

String.replaceAll("(?<=Milan)(?! Vasic)", " Vasic") 

您可以嘗試那些東西了例如,here

+1

使用java.lang.String.replaceAll(String,String) – helios

+0

謝謝;我沒有看到它:) – Joey

+0

謝謝你,這看起來很優雅:) – vaske

5

當你不想把你的手正式表達(可能你應該),你可以先用「米蘭」替換所有「米蘭瓦西奇」字符串。

而不是用「米蘭瓦西奇」替換所有「米蘭」字符串。

8

一種可能性,不斷提升之前減少更長的形式:

string.replaceAll("Milan Vasic", "Milan").replaceAll("Milan", "Milan Vasic") 

另一種方法,治療瓦西奇可選:

string.replaceAll("Milan(Vasic)?", "Milan Vasic") 

其他人描述了基於lookaheadalternation解決方案。

+0

不錯...但正則表達式已經讓你指示非捕獲組:(?!Milan) – helios

+0

這是一個負面的前瞻。非捕獲組將會是'(?:...)' – Joey

21

另一種選擇:

"My name is Milan, people know me as Milan Vasic" 
    .replaceAll("Milan Vasic|Milan", "Milan Vasic")) 
+0

謝謝大家,這可能非常方便以及第一反應! – vaske

+2

更優雅的答案! – lsiu

+1

這不是優雅。它做無用的替換。 – ceving

2

只要爲Apache Commons Lang JAR和使用org.apache.commons.lang.StringUtils類。您會注意到很多安全有效地替換字符串的方法。

您可以在先前鏈接的網站上查看StringUtils API。

「不要重新發明輪子」

+0

不錯的想法,我肯定會同意,如果Java有一個體面的系統來利用別人編寫的代碼(IE,Python的PIP),那麼我會使用它。但事實並非如此,所以我們忍受重新發明輪子,因爲它比使用其他人制造的輪子更容易。 – ArtOfWarfare

3

試試這個:

public static void main(String[] args) { 
    String str = "My name is Milan, people know me as Milan Vasic."; 

    Pattern p = Pattern.compile("(Milan)(?! Vasic)"); 
    Matcher m = p.matcher(str); 

    StringBuffer sb = new StringBuffer(); 

    while(m.find()) { 
     m.appendReplacement(sb, "Milan Vasic"); 
    } 

    m.appendTail(sb); 
    System.out.println(sb); 
} 
+0

這是一般情況的一個很好的例子,可以在運行時計算替換值。 –

1

您可以使用模式匹配,以及將取代所有在一杆。

模式keyPattern = Pattern.compile(key); Matcher matcher = keyPattern.matcher(str); String nerSrting = matcher.replaceAll(value);

相關問題