gpt4 book ai didi

java - 具有特殊接收符号的正则表达式和 ReplaceAll() 会引发错误

转载 作者:行者123 更新时间:2023-12-01 17:22:34 24 4
gpt4 key购买 nike

函数接收到类似这样带有特殊符号 (,>_$' 的内容,并且 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 组合为正则表达式模式时引发错误。

如果没有特殊标志,项目就可以运行。

我使用 Pattern.quote 来转义特殊字符,换句话说,如果像 () 这样输入并使用正则表达式替换所有内容,它将不起作用。

在 C++ Qt 中,它运行良好,但在 Java 中则不然。

解决方案?

最佳答案

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

那就试试吧

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

关于java - 具有特殊接收符号的正则表达式和 ReplaceAll() 会引发错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17498005/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com