具有特殊接收符号的正则表达式和replaceAll()throwns错误

时间:2013-07-05 23:18:02

标签: java regex replaceall

函数接收具有特殊符号(,>_$'和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中没有。

解决方案?

1 个答案:

答案 0 :(得分:5)

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

所以试试

allappend = Matcher.quoteReplacement(allappend);
str_list = rs.replaceAll(regex_newlinebracket, allappend);