替换字符串

时间:2015-06-21 20:04:31

标签: java regex replace matcher

我想用替换来替换某些子串,两者都在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和许多字符串,这可能会影响性能。

非常感谢!

1 个答案:

答案 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

要解决这个问题,你需要用相应的值替换一个出现的问题,否则你将用第一个替换所有出现的问题。