Я хочу проверить соответствие шаблона и, если шаблон соответствует, то я хотел заменить этот текст индексом тестового массива.
public class test {
public static void main(String[] args) {
String[] test={"one","two","three","four"}
Pattern pattern = Pattern.compile("\\$(\\d)+");
String text="{\"test1\":\"$1\",\"test2\":\"$5\",\"test3\":\"$3\",\"test4\":\"$4\"}";
Matcher matcher = pattern.matcher(text);
while(matcher.find()) {
System.out.println(matcher.groupCount());
System.out.println(matcher.replaceAll("test"));
}
System.out.println(text);
}
}
текстовая строка, которую я хотел в этом формате, конечный результат:
{\"test1\":\"one\",\"test2\":\"$two\",\"test3\":\"three\",\"test4\":\"four\"}
, но цикл while завершается после одного совпадения, и "test"
заменяется везде так:
{"test1":"test","test2":"test","test3":"test","test4":"test"}
Использование приведенного ниже кода II дает результат: public class test {
public static void main(String[] args) {
String[] test={"one","two","three","four"};
Pattern pattern = Pattern.compile("\\$(\\d)+");
String text="{\"test1\":\"$1\",\"test2\":\"$2\",\"test3\":\"$3\",\"test4\":\"$4\"}";
Matcher m = pattern.matcher(text);
StringBuffer sb = new StringBuffer();
while (m.find()) {
m.appendReplacement(sb, test[Integer.parseInt(m.group(1)) - 1]);
}
m.appendTail(sb);
System.out.println(sb.toString());
}
}
Но если у меня есть массив замещающего текста, подобный этому
String[] test={"$$one","two","three","four"};
, то из-за $$ я получаю исключение в потоке "main" java.lang.IllegalArgumentException: Illegalгрупповая ссылка на java.util.regex.Matcher.appendReplacement (Matcher.java:857)