正则表达式给出错误

时间:2009-04-02 10:34:35

标签: java regex

继续发帖 Regular expression to allow a set of characters and disallow others

有人知道为什么会发生以下情况吗?

当我创建正则表达式时,我得到以下错误:

[^@*–’”“\r\nœçsÇSgGšcrŠRNEŽDTCnežuUIti—¿„”]+ 

并在输入字段中输入任何这些受限制的字符

java.lang.ArrayIndexOutOfBoundsException
    at org.apache.regexp.RECompiler$RERange.delete(RECompiler.java:1326)
    at org.apache.regexp.RECompiler$RERange.remove(RECompiler.java:1417)
    at org.apache.regexp.RECompiler$RERange.include(RECompiler.java:1459)
    at org.apache.regexp.RECompiler$RERange.include(RECompiler.java:1470)
    at org.apache.regexp.RECompiler.characterClass(RECompiler.java:699)
    at org.apache.regexp.RECompiler.terminal(RECompiler.java:863)
    at org.apache.regexp.RECompiler.closure(RECompiler.java:942)
    at org.apache.regexp.RECompiler.branch(RECompiler.java:1151)
    at org.apache.regexp.RECompiler.expr(RECompiler.java:1203)
    at org.apache.regexp.RECompiler.compile(RECompiler.java:1281)
    at org.apache.regexp.RE.(RE.java:495)
    at org.apache.regexp.RE.(RE.java:480)

但这个表达完全正常

[^@*–’”“\r\nœçsÇSgGšcrŠRN]+

此外,

[^@*–’”“\r\nœçsÇSgGšcrŠR„”]+ 

有效但

[^@*–’”“\r\nœçsÇSgGšcrŠRNE]+ 

不起作用并给出上述错误。

上述方式可以禁止的字符数是否有限制?

此致 Udit Sud

4 个答案:

答案 0 :(得分:3)

破折号(减号)在字符类中具有特殊含义。它定义了连续字符的范围,例如"a-z"

"*–’"可能存在连续范围,但我想这不是你的意图。您可能想要文字短划线,我怀疑您看到的异常与此有关。

而不是:

[^@*–’”“\r\nœçsÇSgGšcrŠRNEŽDTCnežuUIti—¿„”]+
----^ (this is the error)

尝试:

[^@*’”“\r\nœçsÇSgGšcrŠRNEŽDTCnežuUIti—¿„”–]+
-----------------------------------------^ (this okay)

[-^@*’”“\r\nœçsÇSgGšcrŠRNEŽDTCnežuUIti—¿„”]+
-^ (this okay as well)

[^@*\–’”“\r\nœçsÇSgGšcrŠRNEŽDTCnežuUIti—¿„”]+
----^^ (this okay as well)

答案 1 :(得分:2)

请参阅http://webui.sourcelabs.com/jakarta-regexp/issues/22804 - 此软件包的旧版本已将限制允许范围的最大数量限制为16.这在2003年已修复,但可以想象它们只是提高了限制一点点。 (?)

无论如何,我总是使用Java内置的Regex解析器进行任何新工作,正如其他人所建议的那样。

答案 2 :(得分:0)

看起来像apache正则表达式解析器中的一些错误。你能使用标准版(java.util.regex)吗?

答案 3 :(得分:-1)

我自己不是一个大的正则表达式男人,但这里有3个可能有帮助的正则表达式测试网站:

http://www.txt2re.com/index.php3
http://gskinner.com/RegExr/
http://regex.larsolavtorvik.com/