Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Use the backreference in a regex to replace a text dynamically

I want to use the $1 value like an integer.
The idea is to replace all numbers from originaltext with the equivalent array values and create a new text.
The below desired outcome should be "This is DBValue4, This is DBValue2, This is DBValue7"
Also, is there a way to save these backreferences for further use?

String[] values = {"DBValue0","DBValue1","DBValue2","DBValue3","DBValue4","DBValue5","DBValue6","DBValue7","DBValue8","DBValue9","DBValue10"};
String originaltext = "This is 4, This is 2, This is 7";
text = originaltext.replaceAll("(\\d)","$1");
// want something like
text = originaltext.replaceAll("(\\d)",values[$1]);
//or
text = originaltext.replaceAll("(\\d)",values[Integer.parseInt("$1")]);
like image 461
Nikolaos Plastiras Avatar asked Dec 17 '25 17:12

Nikolaos Plastiras


1 Answers

You can use Pattern and Matcher like so:

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);
}

Output:

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

EDIT

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.

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);
}

Output:

company
0
name
1
name
2
This is Company1, This is Bob, This is Eve
like image 159
Boris the Spider Avatar answered Dec 19 '25 10:12

Boris the Spider



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!