替换字符串中的多个子字符串

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

要解决此问题,您只需将出现的一次替换为相应的值,否则您将全部替换为第一个。