【问题标题】:java.util.regex.PatternSyntaxException: Unclosed character class near indexjava.util.regex.PatternSyntaxException:索引附近的未封闭字符类
【发布时间】:2013-07-12 20:00:54
【问题描述】:

我正在用 java 编写一个正则表达式,但是当我运行程序时出现错误。

private final static Pattern QUOTE_VALUE = Pattern.compile("[_]?([a-zA-Z0-9_]+)=(\"[^]*\"),");
// Then later on down the road......
Macher m = QUOTE_VALUE.matcher(myString);
while (m.find()){
  System.out.println("Found " + m.group(1) + " " + m.group(2));
}

我想让我的正则表达式匹配这些示例值。

_MyKey="ID IN [ "ABC" ]",  // Note - it has a comma after the ]
_MyKey="ID IN [ ""XYZ"" ]",   // Note - it has a comma after the ]

我使用在线正则表达式助手进行了尝试 - 我的正则表达式实际上工作正常。但是当我运行程序时,我得到了这个错误:

Caused by: java.util.regex.PatternSyntaxException: Unclosed character class near index 28
[_]?([a-zA-Z0-9_]+)=("[^]*"),

另一个问题是,我如何格式化正则表达式,以便我也可以将它与这个字符串匹配?

MyKey="ID IN [ "ABC" ]",  // without the _
_MyKey="ID IN [ "ABC" ]",  // with the _

谢谢。

[编辑]

你能帮我解决这部分问题吗?

另一个问题是,我如何格式化正则表达式,以便我也可以将它与这个字符串匹配?

MyKey="ID IN [ "ABC" ]", // 没有 _ _MyKey="ID IN [ "ABC" ]", // 带有 _

【问题讨论】:

  • 我猜你有一个未封闭的字符类
  • 查看this page explaining character classes 上标题为“字符类中的元字符”的部分,他们以[^]x] 为例,可以很好地解释您的错误。

标签: java regex


【解决方案1】:

这部分:

[^]

必须是

[\\^]*

如果您正在寻找零或帽子字符的序列。 (注意第一个反斜杠告诉 Java 字符串解析器第二个反斜杠需要留在字符串中。最终结果是正则表达式解析器只看到一个反斜杠并用它来表示帽子字符必须是方括号标识的字符类的一部分。)

或者你错过了一些你不想要的东西:

[^b]*

匹配零个或多个非 b 字符

考虑到你想要匹配的内容,试试[^"]* 或者只是.*

如果确实需要跨行匹配,请使用.* 并将?s 放在正则表达式的前面,以强制java 正则表达式匹配器进入允许点匹配包括换行符在内的所有字符的模式。

感谢@TimPietzcker 的 javascript 注释。这表明在线工具不是 Java 正则表达式检查器,而可能是 javascript 正则表达式检查器。

【讨论】:

  • [^] 是 JavaScript 中 any character, including newlines 的常用简写(因为那里没有 Pattern.DOTALL 选项)。所以很可能是一个简单的.,加上他需要的Pattern.DOTALL选项。
  • 你能帮我解决这部分问题吗?
  • 我认为您只需要 _? 就可以允许 0 或 1 个下划线。我认为您不需要像 [_]? 那样使用大括号,但我认为这也应该有效。我在这里尝试过regexplanet.com/advanced/java/index.html,它适用于两者。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-01
  • 2011-12-28
  • 1970-01-01
  • 1970-01-01
  • 2017-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多