gpt4 book ai didi

java - 在java模式匹配器(正则表达式)中如何迭代每个文本并将其替换为不同的文本

转载 作者:行者123 更新时间:2023-12-02 01:31:06 25 4
gpt4 key购买 nike

我想检查模式匹配,如果模式匹配,那么我想将这些文本匹配替换为测试数组中给定索引处的元素。

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"}

使用下面的代码我得到了结果:

  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 group referenceat java.util.regex.Matcher.appendReplacement(Matcher.java:857)**

最佳答案

以下行是您的问题:

System.out.println(matcher.replaceAll("test"));

如果删除它,循环将遍历所有匹配项。

作为问题的解决方案,您可以用如下内容替换循环:

对于 Java 8:

StringBuffer out = new StringBuffer();
while (matcher.find()) {
String r = test[Integer.parseInt(matcher.group(1)) - 1];
matcher.appendReplacement(out, r);
}
matcher.appendTail(out);
System.out.println(out.toString());

对于 Java 9 及更高版本:

String x = matcher.replaceAll(match -> test[Integer.parseInt(match.group(1)) - 1]);
System.out.println(x);

只有当您将 $5 替换为 $2 时,这才有效,我认为这就是您的目标。

关于替换字符串中的 $ 符号,documentation状态:

A dollar sign ($) may be included as a literal in the replacement string by preceding it with a backslash (\$).

换句话说,您必须将替换数组编写为 String[] test = { "\\$\\$one", "two", "third", "four"};

关于java - 在java模式匹配器(正则表达式)中如何迭代每个文本并将其替换为不同的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56047996/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com