【问题标题】:Regex gives error正则表达式给出错误
【发布时间】:2009-04-02 10:34:35
【问题描述】:

继续发帖 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]+ 

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

像上面那样禁止使用的字符数有限制吗?

问候, 乌迪特南

【问题讨论】:

  • 对我来说听起来像是编码问题,但 Java 不是我的事
  • 如果它让您感觉更好,它可以与 .NET Regex 引擎一起使用。我怀疑这是特定 Java Regex 实现中的错误。
  • @Udit - 当你省略“E”时会发生什么?

标签: java regex


【解决方案1】:

破折号(减号)在字符类中具有特殊含义。它定义了连续字符的范围,例如"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。现在我想知道,如果 .Net 引擎没有出现任何错误,它的行为是否符合预期?!
  • 我猜 "–'" 实际上 * 是 一个有效范围,但它的某些东西让 RECompiler 很糟糕。也许我错了,但破折号很可疑。
  • 我的猜测是它会在一个字符类中包含更多相同的字符。 /[aa]/ 会崩溃吗?
  • 除非有人真正查看 RECompiler.java,否则我们只能猜测。 :-) 从理论上讲,[aa] 很好,不会在任何实现中导致错误。
  • 你指的不是连字符,是破折号(U+2013),另一个是破折号(U+2014)。两者都没有任何特殊含义。该错误是由于 Eddie 指出的错误,而不是 OP 正在做的任何事情。
【解决方案2】:

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

无论如何,正如其他人所建议的那样,我总是将 Java 内置的正则表达式解析器用于任何新工作。

【讨论】:

    【解决方案3】:

    在 apache regexp 解析器中看起来有些错误。你可以使用标准的(java.util.regex)吗?

    【讨论】:

    • 只有问题的作者才能将此帖子标记为“正确的答案”?可惜他没有这样做.. :(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-28
    • 1970-01-01
    • 2021-06-10
    • 2023-04-04
    • 1970-01-01
    • 2021-02-01
    相关资源
    最近更新 更多