我想用替換替換某些子字符串,兩者都在Hashmap中定義。一個例子是:替換字符串中的多個子字符串
import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexTest {
private static HashMap<String, String> conversionTable;
public static void main(String[] args) {
initConversionTable();
System.out.println(convertNumbers("la1"));
System.out.println(convertNumbers("la1, lb3"));
}
private static String convertNumbers(String text) {
String regex = "([aub][1-3])";
Matcher m = Pattern.compile(regex).matcher(text);
while(m.find()) {
text = m.replaceAll(conversionTable.get(m.group()));
}
return text;
}
private static void initConversionTable() {
conversionTable = new HashMap<>();
conversionTable.put("a1", "A1");
conversionTable.put("a2", "A2");
conversionTable.put("a3", "A3");
conversionTable.put("u1", "U1");
conversionTable.put("u2", "U2");
conversionTable.put("u3", "U3");
conversionTable.put("b1", "B1");
conversionTable.put("b2", "B2");
conversionTable.put("b3", "B3");
}
}
輸入數據
la1
la1, lb3
預期的結果應該是
lA1
lA1, lB3
但
lA1
lA1, lA1
到現在爲止我還沒有成功使用Match找到解決方案呃。有沒有這樣的解決方案?當然,我可以通過HashMap的每個條目並進行替換,但我想用匹配器來解決它,因爲我擔心對於很長的哈希表和許多字符串,這可能會影響性能。
非常感謝!
正如接受的答案中所解釋的那樣,replaceAll替換了所有匹配正則表達式匹配的匹配項,它會在find()方法中阻止其他匹配項和正確的替換項。但要解決這個問題,不要使用'replaceFirst'。當我們想要與另一個動態確定的替換(如基於地圖中的鍵的值)匹配時,請使用適當的工具來處理這種場景。所以使用Matcher類中的'appendReplacement'和'appendTail'。 – Pshemo
我把你的問題作爲問題的重複來解決,你可以在這裏看到使用這些方法的解決方案之一。你也可以看看http://stackoverflow.com/a/25081783/1393766,http://stackoverflow.com/a/23689796/1393766 – Pshemo