【问题标题】:Regex with special received signs and replaceAll() throwns errors带有特殊接收符号的正则表达式和 replaceAll() 抛出错误
【发布时间】: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 来证明你的问题吗?
  • 简而言之,如果出现$_-&gt;('); 等特殊符号,函数replaceAll() 会抛出错误,因为它们应该被转义。换句话说,函数replaceAll() 不能替换为 PHP 代码示例。
  • 是的。谢谢你。这是我在 PHP 和 Qt 之后第一次接触 Java。

标签: java regex replaceall


【解决方案1】:

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

那就试试吧

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

【讨论】:

  • 它有效。适用于allappend = Matcher.quoteReplacement(allappend); str_list = rs.replaceAll(selectedfunction, allappend); 解决方案。谢谢你。打开括号后将其添加到fine中。
猜你喜欢
  • 2015-12-23
  • 2020-03-29
  • 1970-01-01
  • 2017-11-14
  • 2011-02-20
  • 2011-10-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多