未封闭的角色类(正则表达式)

时间:2014-03-25 19:58:33

标签: java regex

所以,我有这个半复杂的正则表达式,它搜索两个字符串之间的所有文本,然后替换它。

我的搜索正则表达式是:

(jump *[A-Z].*)(?:[^])*?([A-Z].*:)

这在最后的结束括号中给出了一个Unclosed Character Class,我一直在努力解决这个问题。正则表达式似乎在RegexR(http://regexr.com/?38k63

上按预期工作

有人能提供一些帮助或见解吗?

提前致谢。

3 个答案:

答案 0 :(得分:3)

错误发生在这里:

(jump *[A-Z].*)(?:[^])*?([A-Z].*:)
                   ^

在角色类^中仍然是一个特殊角色。当你放在那里时,它通常会否定其他角色。所以用Java中的\\来逃避它。

答案 1 :(得分:2)

不同的正则表达式引擎会以不同的方式处理[^]。有些人会认为它是否为]的否定字符类的开头,以及模式中下一个]的任何字符,(例如[^][]将匹配除{之外的任何内容{1}}和])。其他引擎将视为空的负字符类(将匹配任何东西)。这就是为什么一些正则表达式引擎会起作用的原因,而其他人则将其报告为错误。

如果您的意思是匹配文字[字符,那么您必须像这样逃避它:

^

或者更好的是,只需将其从字符类中删除(您仍然必须转义它,因为(jump *[A-Z].*)(?:[\^])*?([A-Z].*:) 在字符类之外也有特殊含义):

^

或者,如果你想要匹配下一个(jump *[A-Z].*)(?:\^)*?([A-Z].*:) 的所有内容,请尝试这样的字符类:

[A-Z].*:

当然,因为这是Java,不要忘记你需要转义任何字符串文字中的所有(jump *[A-Z].*)(?:[\s\S])*?([A-Z].*:) 个字符。

答案 2 :(得分:1)

这里似乎使用[^]

(jump *[A-Z].*)(?:[^])*?([A-Z].*:)
                   ^
-------------------|

请尝试使用此正则表达式:

(jump *[A-Z].*)[\\s\\S]*?([A-Z].*:)

或者这个:

(?s)(jump *[A-Z].*).*?([A-Z].*:)