在
Pattern
的 javadoc 中,定义了以下内容:
(?idmsuxU-idmsuxU)
- 什么也不做,但可以打开或关闭匹配标志:i, d, m, s, u, x, U
(?idmsux-idmsux:X)
- 作为非捕获组出现,可在给定的标志i,d,m,s,u,x开关中打开标志,- 代表关闭
而 (?i)
打开了匹配标志 CASE_INSENSITIVE
的功能,一直持续到正则表达式模式的末尾,(?i:X)
只在 X
中打开了此标志。
例如以下两者相同1:
Foo(?i)Bar(?-i)Baz
Foo(?i:Bar)Baz
请注意javadoc中的以下评论:
在Perl中,表达式顶层处的嵌入式标志会影响整个表达式。在此类中,嵌入式标志总是在它们出现的位置生效,无论它们是在顶层还是在组内;对于后一种情况,在组的结尾处,与Perl一样会恢复标志。
1)这并不意味着(?i)X(?-i)和(?i:X)始终相同,请参见注释。
更新-证明:
System.out.println("Foo(?i)Bar(?-i)Baz Foo(?i:Bar)Baz");
for (String s : new String[] {"FooBarBaz","FoobarBaz","FooBARBaz","FoobARBaz","FOOBarBaz","FooBarBAZ"})
System.out.printf(" %-18s%-12s%s%n", s.matches("Foo(?i)Bar(?-i)Baz"), s.matches("Foo(?i:Bar)Baz"), s);
输出
Foo(?i)Bar(?-i)Baz Foo(?i:Bar)Baz
true true FooBarBaz
true true FoobarBaz
true true FooBARBaz
true true FoobARBaz
false false FOOBarBaz
false false FooBarBAZ