在Java模式Matcher(regex)中,如何迭代和用不同的文本替换每个文本

时间:2019-05-08 19:44:50

标签: java regex

我想检查模式是否匹配,是否要检查模式数学,然后用测试数组索引替换这些文本。

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

}
}

但是如果我有这样的replacetext数组

String[] test={"$$one","two","three","four"};

然后因为$$,我在线程“ main”中获取异常java.lang.IllegalArgumentException:非法组引用 在java.util.regex.Matcher.appendReplacement(Matcher.java:857)

2 个答案:

答案 0 :(得分:2)

以下是您的问题:

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指出:

  

美元符号($)可以通过在其前面加上反斜杠(\ $)作为替换字符串包含在文字中。

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

答案 1 :(得分:0)

如果愿意,我可以提供正则表达式解决方案,但这要容易得多(假设这是所需的输出)。

      int count = 1;
      for (String s : test) {
         text = text.replace("$" + count++, s);
      }
      System.out.println(text);

它打印。

{"test1":"one","test2":"two","test3":"three","test4":"four"}