我想用替换来替换某些子串,两者都在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
到目前为止,我还没有成功找到Matcher的解决方案。有这样的解决方案吗?当然,我可以浏览HashMap的每个条目并进行替换,但我想用Matcher解决它,因为我担心对于很长的Hashmap和许多字符串,这可能会影响性能。
非常感谢!
答案 0 :(得分:1)
问题是您使用replaceAll方法,因此会发生这种情况。
第1步:
la1
la1, lb3
将进入循环,因为m.Find()返回true。它会找到第一个模式&#34; la1&#34;。现在,您将从表中获得转换,即&#34; lA1&#34;并替换模式的所有出现,这是&#34; la1&#34;和&#34; lb3&#34;。 然后循环不会再次迭代,因为输出已经
lA1
lA1, lA1
要解决这个问题,你需要用相应的值替换一个出现的问题,否则你将用第一个替换所有出现的问题。