问题
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")]);
回答1:
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 String
s 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 Map
ping 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
来源:https://stackoverflow.com/questions/17835757/use-the-backreference-in-a-regex-to-replace-a-text-dynamically