替换字符串中的多个子字符串
Replace multiple substrings within a string
我想用一个替换项来替换某些子字符串,这两个子字符串都定义在一个 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
直到现在我还没有成功地找到一个匹配器的解决方案。有这样的解决方案吗?当然我可以遍历 HashMap 的每个 Entry 并进行替换,但我想用 Matcher 解决它,因为我担心对于很长的 Hashmap 和很多字符串这会影响性能。
非常感谢!
问题是您使用了 replaceAll 方法,所以会发生这种情况。
第 1 步:
la1
la1, lb3
将进入循环,因为 m.Find() returns 为真。它将找到第一个模式 "la1"。现在您将从 table 转换为 "lA1" 并替换所有出现的模式,即 "la1" 和 "lb3"。
那么循环就不会再迭代了,因为输出已经是
lA1
lA1, lA1
要解决此问题,您只需将出现的一次替换为相应的值,否则您将全部替换为第一个。
我想用一个替换项来替换某些子字符串,这两个子字符串都定义在一个 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
直到现在我还没有成功地找到一个匹配器的解决方案。有这样的解决方案吗?当然我可以遍历 HashMap 的每个 Entry 并进行替换,但我想用 Matcher 解决它,因为我担心对于很长的 Hashmap 和很多字符串这会影响性能。
非常感谢!
问题是您使用了 replaceAll 方法,所以会发生这种情况。
第 1 步:
la1
la1, lb3
将进入循环,因为 m.Find() returns 为真。它将找到第一个模式 "la1"。现在您将从 table 转换为 "lA1" 并替换所有出现的模式,即 "la1" 和 "lb3"。 那么循环就不会再迭代了,因为输出已经是
lA1
lA1, lA1
要解决此问题,您只需将出现的一次替换为相应的值,否则您将全部替换为第一个。