0

一个函数接收到这样的带有特殊符号的东西(,>_$',Java replaceAll 抛出错误。


样本输入

如果输入这样的内容,我会收到错误:

[ FAILED ] appendtext变量具有System.lineSeparator()

$model_fsdfdsfdsfdsfdsfds->load('fsdfdsfdsfdsfdsfds','dsfsdfsd');
$model_fsdfdsfdsfdsfdsfds->fsdfdsfdsfdsfdsfds->index();

如果输入为没有错误:

[OKAY] appendtext变量有简单的输入System.lineSeparator()

mysomethingmodel
blabla

解释

appendtext与其他组合进入 String :

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 中则不行。

解决方案?

4

1 回答 1

5

您使用Pattern.quote. 但是导致实际问题的是替换字符串,因为它包含$(这是替换字符串中的相关引用字符)。幸运的是,Java 为您提供了另一个引用函数,只是为了使替换字符串安全:Matcher.quoteReplacement()

所以试试

allappend = Matcher.quoteReplacement(allappend);
str_list = rs.replaceAll(regex_newlinebracket, allappend);
于 2013-07-05T23:32:34.987 回答