gpt4 book ai didi

java - 索引 nnn 附近的未闭合字符类

转载 作者:可可西里 更新时间:2023-11-01 13:45:54 25 4
gpt4 key购买 nike

我从一些 PHP Textile 实现(开源,正确归因)中借用了一个相当复杂的正则表达式,用于一个简单的,功能不完整的 Java 实现,textile4j,我正在移植到 github 并同步到 Maven central(编写原始代码是为了为 blojsom(一个 Java 博客平台)提供插件;这是使 blojsom 依赖项在 Maven Central 中可用的更大努力的一部分)。

不幸的是,纺织正则表达式(虽然它们在 PHP 中的 preg_replace_callback 上下文中工作)在 Java 中失败,但出现以下异常:

java.util.regex.PatternSyntaxException:索引 217 附近的未闭合字符类

陈述是显而易见的,解决方案是难以捉摸的。

这是来自 PHP 实现的原始多行正则表达式:

return preg_replace_callback('/
(^|(?<=[\s>.\(])|[{[]) # $pre
" # start
(' . $this->c . ') # $atts
([^"]+?) # $text
(?:\(([^)]+?)\)(?="))? # $title
":
('.$this->urlch.'+?) # $url
(\/)? # $slash
([^\w\/;]*?) # $post
([\]}]|(?=\s|$|\)))
/x',callback,input);

巧妙地,我让 textile 类“向我显示代码”在这个正则表达式中使用,带有一个简单的 echo,结果是以下相当长的正则表达式:

(^|(?<=[\s>.\(])|[{[])"((?:(?:\([^)]+\))|(?:\{[^}]+\})|(?:\[[^]]+\])|(?:\<(?!>)|(?<!<)\>|\<\>|\=|[()]+(?! )))*)([^"]+?)(?:\(([^)]+?)\)(?="))?":([\w"$\-_.+!*'(),";\/?:@=&%#{}|\^~\[\]`]+?)(\/)?([^\w\/;]*?)([\]}]|(?=\s|$|\)))

我使用在线工具(例如 RegExr by gskinner)发现了几个可能导致解析错误的区域。和 RegexPlanet .但是,这些细节都无法修复错误。

我怀疑其中一个字符类中隐藏了一个范围问题,或者某处隐藏了一个 Unicode 顺序,但我找不到它。

有什么想法吗?

我也很好奇为什么 PHP 没有抛出类似的错误,例如,我发现一个“被动子表达式”使用 RegExr 处理不当,但它没有修复 Java 异常并且没有改变行为PHP,如下所示。

#title 中切换转义的括号:

        (?:\(([^)]+?)\)(?="))? # $title
...^
(?:(\([^)]+?)\)(?="))? # $title
....^

谢谢,蒂姆

编辑:添加 Textile 正则表达式的 Java 字符串解释(带转义符),由 RegexPlanet 确定...

"(^|(?<=[\\s>.\\(])|[{[])\"((?:(?:\\([^)]+\\))|(?:\\{[^}]+\\})|(?:\\[[^]]+\\])|(?:\\<(?!>)|(?<!<)\\>|\\<\\>|\\=|[()]+(?! )))*)([^\"]+?)(?:\\(([^)]+?)\\)(?=\"))?\":([\\w\"$\\-_.+!*'(),\";\\/?:@=&%#{}|\\^~\\[\\]`]+?)(\\/)?([^\\w\\/;]*?)([\\]}]|(?=\\s|$|\\)))"

最佳答案

@CodeJockey 是正确的:您的一个字符类中有一个方括号需要转义。 []][^]] 都可以,因为 ] 是除否定 ^ 之外的第一个字符,但在 Java 中,字符类中任何位置的未转义 [ 都是语法错误。

具有讽刺意味的是,原始正则表达式包含许多甚至在 PHP 中也不需要的反斜杠。它还对 / 进行转义,因为它用作正则表达式定界符。在清除所有这些之后,我想出了这个 Java 正则表达式:

"(^|(?<=[\\s>.(])|[{\\[])\"((?:(?:\\([^)]+\\))|(?:\\{[^}]+\\})|(?:\\[[^]]+\\])|(?:<(?!>)|(?<!<)>|<>|=|[()]+(?! )))*)([^\"]+?)(?:\\(([^)]+?)\\)(?=\"))?\":([\\w\"$_.+!*'(),\";/?:@=&%#{}|^~\\[\\]`-]+?)(/)?([^\\w/;]*?)([]}]|(?=\\s|$|\\)))"

我不知道它是否是最好的正则表达式,也不知道它是如何被使用的。

关于java - 索引 nnn 附近的未闭合字符类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8126339/

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