java - 在使用带有模式匹配的 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)
我应该如何执行这样的替换,以免出现错误?
解决方案
正如这里提到的
美元符号 ($) 可以作为文字包含在替换字符串中,方法是在其前面加上反斜杠 (\$)。
因此,通过将方法调用更改为:
matcher.appendReplacement(buffStr, group.replace("$","\\$"));
我得到了预期的结果而没有破坏任何东西。
推荐阅读
- php - 在 Woocommerce 上的 SQL 查询中获取产品的目录可见性
- java - JHipster/React - 匿名从服务器获取数据(登录前)
- python - [:, :, ::-1] 在 python 中是什么意思?
- asciidoctor - 使用 Asciidoctor,如何在“include::”期间排除标签之间的代码?
- sql - 带有 YEAR() 函数的 SQL Server Pivot
- wordpress - 将 Sage WordPress 主题转换为常规主题
- selenium - 未定义注释类型 FindBy 的属性 css
- c# - 如何通过按一个来选中所有复选框?
- c++ - c++ 类和范围内的标头
- jupyter-notebook - 如何从 Sagemaker 培训中打印调试信息?