在使用带有模式匹配的 appendReplacement 之前清理输入
Sanitizing input before using appendReplacement with pattern matching
我对 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)
我应该如何执行这样的替换才不会出错?
如前所述here
A dollar sign ($) may be included as a literal in the replacement
string by preceding it with a backslash ($).
因此,通过将方法调用更改为:
matcher.appendReplacement(buffStr, group.replace("$","\$"));
我在没有破坏任何东西的情况下得到了预期的结果。
我对 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)
我应该如何执行这样的替换才不会出错?
如前所述here
A dollar sign ($) may be included as a literal in the replacement string by preceding it with a backslash ($).
因此,通过将方法调用更改为:
matcher.appendReplacement(buffStr, group.replace("$","\$"));
我在没有破坏任何东西的情况下得到了预期的结果。