[英]Unclosed character class near index nnn
我正在从一些PHP Textile实现(开源,正确归因)中借用一个相当复杂的正则表达式,用于一个简单的,不完全特征完整的Java实现,textile4j,我正在移植到github并同步到Maven central(原始代码是编写为blojsom提供插件,这是一个Java博客平台;这是在Maven Central中提供blojsom依赖项的更大努力的一部分。
不幸的是,纺织品正则表达式(虽然它们在PHP中的preg_replace_callback
上下文中工作)在Java中失败,但有以下异常:
java.util.regex.PatternSyntaxException: Unclosed character class near index 217
声明很明显,解决方案难以捉摸。
这是来自PHP实现的原始多行正则表达式:
return preg_replace_callback('/
(^|(?<=[\s>.\(])|[{[]) # $pre
" # start
(' . $this->c . ') # $atts
([^"]+?) # $text
(?:\(([^)]+?)\)(?="))? # $title
":
('.$this->urlch.'+?) # $url
(\/)? # $slash
([^\w\/;]*?) # $post
([\]}]|(?=\s|$|\)))
/x',callback,input);
巧妙地,我得到了纺织类来“显示我在这个正则表达式中使用的代码”,带有一个简单的echo
,导致以下相当长的正则表达式:
(^|(?<=[\s>.\(])|[{[])"((?:(?:\([^)]+\))|(?:\{[^}]+\})|(?:\[[^]]+\])|(?:\<(?!>)|(?<!<)\>|\<\>|\=|[()]+(?! )))*)([^"]+?)(?:\(([^)]+?)\)(?="))?":([\w"$\-_.+!*'(),";\/?:@=&%#{}|\^~\[\]`]+?)(\/)?([^\w\/;]*?)([\]}]|(?=\s|$|\)))
我发现了一些可能导致解析错误的可能区域,使用gskinner和RegexPlanet等RegExr等在线工具。 但是,这些细节都没有解决错误。
我怀疑其中一个字符类中隐藏了一个范围问题,或隐藏在某个地方的Unicode命令,但我找不到它。
有任何想法吗?
我也很好奇为什么PHP不会抛出类似的错误,例如,我发现一个“被动子表达式”使用RegExr处理不当,但它没有修复Java异常并且没有改变PHP中的行为,显示下面。
在#title
切换转义的paren:
(?:\(([^)]+?)\)(?="))? # $title
...^
(?:(\([^)]+?)\)(?="))? # $title
....^
蒂姆,谢谢
编辑:添加Tex正则表达式的Java字符串解释(带转义),由RegexPlanet确定...
"(^|(?<=[\\s>.\\(])|[{[])\"((?:(?:\\([^)]+\\))|(?:\\{[^}]+\\})|(?:\\[[^]]+\\])|(?:\\<(?!>)|(?<!<)\\>|\\<\\>|\\=|[()]+(?! )))*)([^\"]+?)(?:\\(([^)]+?)\\)(?=\"))?\":([\\w\"$\\-_.+!*'(),\";\\/?:@=&%#{}|\\^~\\[\\]`]+?)(\\/)?([^\\w\\/;]*?)([\\]}]|(?=\\s|$|\\)))"
@CodeJockey是正确的:你的一个角色类中有一个方括号需要转义。 []]
或[^]]
是可以的,因为]
是除否定^
之外的第一个字符,但在Java中,未转义[
字符类中的任何位置都是语法错误。
具有讽刺意味的是,原始的正则表达式包含许多反斜杠,即使在PHP中也是如此。 它也逃脱/
因为它用作正则表达式分隔符。 除草了所有这些后,我想出了这个Java正则表达式:
"(^|(?<=[\\s>.(])|[{\\[])\"((?:(?:\\([^)]+\\))|(?:\\{[^}]+\\})|(?:\\[[^]]+\\])|(?:<(?!>)|(?<!<)>|<>|=|[()]+(?! )))*)([^\"]+?)(?:\\(([^)]+?)\\)(?=\"))?\":([\\w\"$_.+!*'(),\";/?:@=&%#{}|^~\\[\\]`-]+?)(/)?([^\\w/;]*?)([]}]|(?=\\s|$|\\)))"
它是否是最好的正则表达式我不知道,不知道它是如何被使用的。
我不确定你的问题究竟在哪里,但这可能会有所帮助:
在Java中(我相信这是Java独有的), [
符号(不仅仅是]
符号)在字符类中保留,需要进行转义。
修订后的表达式应该类似于以下内容,以便与Java兼容:
(^|(?<=[\s>.\(])|[{\[]) # $pre
" # start
(' . $this->c . ') # $atts
([^"]+?) # $text
(?:\(([^)]+?)\)(?="))? # $title
":
('.$this->urlch.'+?) # $url
(\/)? # $slash
([^\w\/;]*?) # $post
([\]}]|(?=\s|$|\)))
/x
基本上,大多数正则表达式的任何地方都允许使用像[az,;[\\]+-]
这样的字符类[az,;[\\]+-]
它可以匹配“字母a
- z
或逗号,分号,开放或关闭方括号,加号或减号签名“,需要实际上是[az,;\\[\\]+-]
(转义[
带有\\
字符]
这种转义要求是由Java 联合,交集和减法字符类构造引起的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.