所以,我有这个半复杂的正则表达式,它搜索两个字符串之间的所有文本,然后替换它。
我的搜索正则表达式是:
(jump *[A-Z].*)(?:[^])*?([A-Z].*:)
这在最后的结束括号中给出了一个Unclosed Character Class,我一直在努力解决这个问题。正则表达式似乎在RegexR(http://regexr.com/?38k63)
上按预期工作有人能提供一些帮助或见解吗?
提前致谢。
答案 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].*:)