我正在尋找在Java中查找和替換字符串的最佳方法。Java查找和替換字符串的最佳方法是什麼?
這是一句話:「我的名字是米蘭,人們認識我爲米蘭瓦西奇」。
我想用米蘭瓦西奇替換米蘭的米蘭,但是在我已經有米蘭瓦西奇的地方,那不應該是個案。
搜索/替換結果應該是:「我的名字是米蘭瓦西奇,人們認識我爲米蘭瓦西奇」。
我試圖使用indexOf()和模式/匹配器組合,但我的結果都不看起來優雅,有人有優雅的解決方案嗎?
乾杯!
我正在尋找在Java中查找和替換字符串的最佳方法。Java查找和替換字符串的最佳方法是什麼?
這是一句話:「我的名字是米蘭,人們認識我爲米蘭瓦西奇」。
我想用米蘭瓦西奇替換米蘭的米蘭,但是在我已經有米蘭瓦西奇的地方,那不應該是個案。
搜索/替換結果應該是:「我的名字是米蘭瓦西奇,人們認識我爲米蘭瓦西奇」。
我試圖使用indexOf()和模式/匹配器組合,但我的結果都不看起來優雅,有人有優雅的解決方案嗎?
乾杯!
那麼,你可以使用一個regular expression找到其中「米蘭」後面沒有「瓦西奇」的情況:
Milan(?! Vasic)
並更換由全名:
String.replaceAll("Milan(?! Vasic)", "Milan Vasic")
(?!...)
部分是一個negative lookahead,它確保任何匹配沒有被括號中的部分跟隨。它不會消耗比賽本身中的任何字符。
或者,您可以簡單地插入(在技術上取代零寬度匹配)姓氏後面的姓氏,除非後面跟着姓氏。這看起來相似,但採用的是positive lookbehind還有:
(?<=Milan)(?! Vasic)
您可以通過只" Vasic"
替換此(注意在字符串的開頭空格):
String.replaceAll("(?<=Milan)(?! Vasic)", " Vasic")
您可以嘗試那些東西了例如,here。
當你不想把你的手正式表達(可能你應該),你可以先用「米蘭」替換所有「米蘭瓦西奇」字符串。
而不是用「米蘭瓦西奇」替換所有「米蘭」字符串。
一種可能性,不斷提升之前減少更長的形式:
string.replaceAll("Milan Vasic", "Milan").replaceAll("Milan", "Milan Vasic")
另一種方法,治療瓦西奇可選:
string.replaceAll("Milan(Vasic)?", "Milan Vasic")
其他人描述了基於lookahead或alternation解決方案。
只要爲Apache Commons Lang JAR和使用org.apache.commons.lang.StringUtils類。您會注意到很多安全有效地替換字符串的方法。
您可以在先前鏈接的網站上查看StringUtils API。
「不要重新發明輪子」
不錯的想法,我肯定會同意,如果Java有一個體面的系統來利用別人編寫的代碼(IE,Python的PIP),那麼我會使用它。但事實並非如此,所以我們忍受重新發明輪子,因爲它比使用其他人制造的輪子更容易。 – ArtOfWarfare
試試這個:
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);
}
這是一般情況的一個很好的例子,可以在運行時計算替換值。 –
您可以使用模式匹配,以及將取代所有在一杆。
模式keyPattern = Pattern.compile(key); Matcher matcher = keyPattern.matcher(str); String nerSrting = matcher.replaceAll(value);
在這種情況下米蘭班迪奇呢?讓我們在同一句話中有一個米蘭瓦西奇和一個米蘭班迪奇,那麼第一個米蘭將會忽略系統,第二個將會是米蘭瓦西奇Bandic? :) –
heheeh ...我用這個例子的名字:) – vaske