在Java中如何匹配不是“[”的字符?

时间:2012-08-03 15:45:10

标签: java regex

我有一个文本块,其信息编码如下:

[tag 1] some text [tag 2] more text [tag 3] even more text 

我正在使用Java创建一个正则表达式,它将编码信息提取到单独的字符串中。如:

[tag 1] some text
[tag 2] more text
[tag 3] even more text

我创建的正则表达式是(对于常规模式匹配):“([.+?][^[]+)”

这个正则表达式在Notepad ++和两个在线工具中运行良好:

  1. http://www.regextester.com/
  2. http://www.softlion.com/webTools/RegExpTest/default.aspx
  3. 在Java中,这个正则表达式语句产生一个运行时异常:

    Pattern pattern = Pattern.compile(“(\\[.+?\\][^[]+)”);
    

    异常详情:

    Exception in thread "main" java.util.regex.PatternSyntaxException: Unclosed character class near index 13
    (\[.+?\][^[]+)
                 ^
    

    我是否必须逃避角色类中否定的“[”?如果是的话怎么样?

4 个答案:

答案 0 :(得分:3)

在否定字符类中转义[。尽管在字符类中不需要这样做,但显然Java存在问题,并且它不会改变字符类的含义以转义在字符类中不应具有特殊含义的字符。 / p>

尝试以下方法:

(\[.+?\][^\[]+)

或者对于Java代码:

Pattern pattern = Pattern.compile(“(\\[.+?\\][^\\[]+)”);

答案 1 :(得分:1)

你需要摆脱方括号,就像你之前逃过它们一样:

(\\[.+?\\][^\\[]+)

引发运行时异常是因为RegEx解析器将[^ []视为具有未闭合的括号。

答案 2 :(得分:0)

您需要转义括号,这应该有效:

[^\\[]

答案 3 :(得分:0)

Java实现似乎有一个bug。

通常情况下,正则表达式并不要求你逃避它,但无论如何都要尝试逃避它。

(\[.+?\][^\[]+)
"(\\[.+?\\][^\\[]+)"

即使不需要,也可以认为逃避特殊字符是一种好习惯。它还有助于避免这样的错误。