首页 > 解决方案 > 在使用带有模式匹配的 appendReplacement 之前清理输入

问题描述

我的方法有问题appendReplacement。我正在处理许多来源,并且碰巧其中一些包含命名组(例如${name})。

示例代码:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class HelloWorld{

     private static final Pattern SOURCE_BLOCK_PATTERN = Pattern.compile("<source>.*?</source>");

     public static void main(String []args){
        String inputText = "<p>something</p> <source> <p> @${xx} </p> </source> <p>something</p>";

        Matcher matcher = SOURCE_BLOCK_PATTERN.matcher(inputText);
        StringBuffer buffStr = new StringBuffer();

        while (matcher.find()) {
            String group = matcher.group();
            group = group.replaceAll("<[/]?p>", "");
            matcher.appendReplacement(buffStr, group);
        }
        matcher.appendTail(buffStr);
        String outputText = buffStr.toString();

     }
}

结果是:

Exception in thread "main" java.lang.IllegalArgumentException: No group with name {xx}
    at java.util.regex.Matcher.appendReplacement(Matcher.java:849)
    at HelloWorld.main(HelloWorld.java:17)

我应该如何执行这样的替换,以免出现错误?

标签: javaregexpattern-matching

解决方案


正如这里提到的

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

因此,通过将方法调用更改为:

matcher.appendReplacement(buffStr, group.replace("$","\\$"));

我得到了预期的结果而没有破坏任何东西。


推荐阅读