函数接收具有特殊符号(,>_$'
和Java replaceAll throwns错误的类似内容。
SAMPLE INPUT
如果输入如下内容,我收到错误:
[FAILED] 附加文字变量与System.lineSeparator()
:
$model_fsdfdsfdsfdsfdsfds->load('fsdfdsfdsfdsfdsfds','dsfsdfsd');
$model_fsdfdsfdsfdsfdsfds->fsdfdsfdsfdsfdsfds->index();
输入为:
时无错误 [OKAY] appendtext 变量只有System.lineSeparator()
的简单输入:
mysomethingmodel
blabla
说明的
appendtext 与其他组合一起进入字符串:
String allappend = "Something simple var" + System.lineSeparator() + "\t{" + System.lineSeparator() + appendtext;
好。比使用正则表达式替换所有并抛出错误:
str_list = rs.replaceAll(regex_newlinebracket, allappend);
regex_newlinebracket 是来自其他函数的正则表达式:
public String RegexPatternsFunction(String types, String function_name)
{
// get a rid of special sign
String function_name_quoted = Pattern.quote(function_name);
switch (types) {
case "newlinebracket":
return function_name_quoted + "(\\s|\\t|\\n)+[{]";
}
return null;
}
错误
线程中的异常“AWT-EventQueue-0”java.lang.IllegalArgumentException:非法组引用
at java.util.regex.Matcher.appendReplacement(Matcher.java:808)
at java.util.regex.Matcher.replaceAll(Matcher.java:906)
at java.lang.String.replaceAll(String.java:2162)
来自Matcher.java的或完全内幕的appendReplacement函数:
// The first number is always a group
refNum = (int)nextChar - '0';
if ((refNum < 0)||(refNum > 9))
throw new IllegalArgumentException(
"Illegal group reference");
cursor++;
问题
使用与
相同的特殊字符$model_fsdfdsfdsfdsfdsfds->load('fsdfdsfdsfdsfdsfds','dsfsdfsd');
$model_fsdfdsfdsfdsfdsfds->fsdfdsfdsfdsfdsfds->index();
将replaceAll组合为Regex模式时出错。
如果没有特别标志,项目将起作用。
我正在使用Pattern.quote
转义特殊字符,换句话说,如果使用正则表达式输入()
和replaceAll,则无效。
在C ++ Qt中,它运行良好,在Java中没有。
解决方案?
答案 0 :(得分:5)
使用Pattern.quote
很好(也很必要)。但是导致实际问题的是替换字符串,因为它包含$
(替换字符串中的相关引用字符)。幸运的是,Java为您提供了另一个引用函数,只是为了使替换字符串安全:Matcher.quoteReplacement()
所以试试
allappend = Matcher.quoteReplacement(allappend);
str_list = rs.replaceAll(regex_newlinebracket, allappend);