且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

在正则表达式中使用反向引用来动态替换文本

更新时间:2022-11-26 14:29:58

您可以使用模式 Matcher 之类似:

public static void main(String[] args) throws Exception {
    final String[] values = {"DBValue0", "DBValue1", "DBValue2", "DBValue3", "DBValue4", "DBValue5", "DBValue6", "DBValue7", "DBValue8", "DBValue9", "DBValue10"};
    final String originaltext = "This is 4, This is 2, This is 7";
    final Pattern pattern = Pattern.compile("(?<=This is )\\d++");
    final Matcher matcher = pattern.matcher(originaltext);
    final StringBuffer sb = new StringBuffer();
    while (matcher.find()) {
        System.out.println(matcher.group());
        final int index = Integer.parseInt(matcher.group());
        matcher.appendReplacement(sb, values[index]);
    }
    matcher.appendTail(sb);
    System.out.println(sb);
}

输出:

4
2
7
This is DBValue4, This is DBValue2, This is DBValue7

编辑

OP的评论似乎OP需要替换字符串的形式 {name,index} 其中name是数组的名称和index 是该数组中元素的索引。

Further to the OP's comment is seems that the OP needs to replace Strings of the form {name, index} where "name" is the name of an array and "index" is the index of an element in that array.

这很容易通过 Map 将数组ping到它们的名称使用 Map< String,String []> 然后使用模式首先捕获 name 然后索引

This is easily achieved by Mapping the arrays to their names using a Map<String, String[]> and then using a Pattern that captures first the name then the index.

public static void main(String[] args) throws Exception {
    final String[] companies = {"Company1", "Company2", "Company3"};
    final String[] names = {"Alice", "Bob", "Eve"};
    final String originaltext = "This is {company, 0}, This is {name, 1}, This is {name, 2}";
    final Map<String, String[]> values = new HashMap<>();
    values.put("company", companies);
    values.put("name", names);
    final Pattern pattern = Pattern.compile("\\{([^,]++),\\s*+(\\d++)}");
    final Matcher matcher = pattern.matcher(originaltext);
    final StringBuffer sb = new StringBuffer();
    while (matcher.find()) {
        System.out.println(matcher.group(1));
        System.out.println(matcher.group(2));
        final int index = Integer.parseInt(matcher.group(2));
        matcher.appendReplacement(sb, values.get(matcher.group(1))[index]);
    }
    matcher.appendTail(sb);
    System.out.println(sb);
}

输出:

company
0
name
1
name
2
This is Company1, This is Bob, This is Eve