【发布时间】:2013-07-04 02:17:13
【问题描述】:
函数接收到带有特殊符号(,>_$' 的类似内容,Java replaceAll 抛出错误。
样本输入
如果输入这样的内容,我得到一个错误:
[ FAILED ] appendtext 变量有 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;
好的。比它用正则表达式进入 replaceAll 并引发错误:
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 来转义特殊字符,换句话说,如果像() 这样的输入并使用正则表达式替换所有,它将不起作用。
在 C++ Qt 中,它运行良好,而在 Java 中则不行。
解决方案?
【问题讨论】:
-
你的问题很难理解。你可以发SSCCE 来证明你的问题吗?
-
简而言之,如果出现
$_->(');等特殊符号,函数replaceAll()会抛出错误,因为它们应该被转义。换句话说,函数replaceAll()不能替换为 PHP 代码示例。 -
是的。谢谢你。这是我在 PHP 和 Qt 之后第一次接触 Java。
标签: java regex replaceall