繁体   English   中英

未封闭字符类(正则表达式)

[英]Unclosed Character Class (Regex)

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

我的搜索正则表达式是:

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

这在最终的结束括号中提供了一个Unclosed字符类,我一直在努力解决。 regex似乎可以在RegexR( http://regexr.com/?38k63 )上正常工作

谁能提供帮助或见解?

提前致谢。

错误在这里:

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

在字符类中, ^仍然是特殊字符。 当您放置其他字符时,它通常会否定其他字符。 因此,在Java中使用\\\\对其进行转义。

不同的正则表达式引擎将对[^]不同的处理。 有人会假设这是一个否定字符类的开始,不包括]和该模式中直到下一个]任何字符(例如[^][]将匹配除][之外的任何字符)。 其他引擎将被视为空的否定字符类(它将匹配任何内容)。 这就是为什么某些正则表达式引擎可以运行,而另一些则将其报告为错误的原因。

如果要让它与文字^字符匹配,则必须像这样转义它:

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

或者更好的是,只需将其从字符类中删除(您仍然必须对其进行转义,因为^在字符类之外也具有特殊含义):

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

或者,如果您要让它匹配下一个[AZ].*: ,请尝试这样的字符类:

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

当然,因为这是Java,所以不要忘记您需要对任何字符串文字中的所有\\字符进行转义。

在使用[^]

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

尝试使用此正则表达式:

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

或这个:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM