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

Mar*_*vac 0 java regex replaceall

函数接收具有特殊符号(,>_$'和Java replaceAll throwns错误的类似内容.


样本输入

如果输入这样的东西我得到一个错误:

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

$model_fsdfdsfdsfdsfdsfds->load('fsdfdsfdsfdsfdsfds','dsfsdfsd');
$model_fsdfdsfdsfdsfdsfds->fsdfdsfdsfdsfdsfds->index();
Run Code Online (Sandbox Code Playgroud)

如果输入为:

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

mysomethingmodel
blabla
Run Code Online (Sandbox Code Playgroud)

说明

appendtext与其他组合一起进入String:

String allappend = "Something simple var" + System.lineSeparator() + "\t{" + System.lineSeparator() + appendtext;
Run Code Online (Sandbox Code Playgroud)

好的.比使用正则表达式替换所有并抛出错误:

str_list = rs.replaceAll(regex_newlinebracket, allappend);
Run Code Online (Sandbox Code Playgroud)

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;
    }
Run Code Online (Sandbox Code Playgroud)

错误

例外在线程 "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)
Run Code Online (Sandbox Code Playgroud)

或者来自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++;
Run Code Online (Sandbox Code Playgroud)

问题

使用特殊字符作为

$model_fsdfdsfdsfdsfdsfds->load('fsdfdsfdsfdsfdsfds','dsfsdfsd');
$model_fsdfdsfdsfdsfdsfds->fsdfdsfdsfdsfdsfds->index();
Run Code Online (Sandbox Code Playgroud)

throwns在的replaceAll的组合作为正则表达式模式错误.

如果没有特别标志,项目将起作用.

我使用Pattern.quote到转义它不会工作,如果喜欢来输入换句话说特殊字符()和的replaceAll使用正则表达式.

在C++ Qt中,它运行良好,而不是Java.

解决方案?

Mar*_*der 5

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

所以试试吧

allappend = Matcher.quoteReplacement(allappend);
str_list = rs.replaceAll(regex_newlinebracket, allappend);
Run Code Online (Sandbox Code Playgroud)