我遇到了用 Java 代码编写的以下条件:
String pattern = "(?i:U[A-Z0-9]C.*)";
if (foo.matches(pattern))) {
...
Run Code Online (Sandbox Code Playgroud)
我不明白什么?i:意思。我见过(?i)用来表示不区分大小写的,但不确定这里的形式。
谢谢你的帮助!
在 的 javadoc 中Pattern,它被定义为:
而(?i)转弯的标志CASE_INSENSITIVE上的正则表达式模式的剩余部分,(?i:X)只ON标志X。
例如,这些都是相同的1:
Foo(?i)Bar(?-i)Baz
Foo(?i:Bar)Baz
Run Code Online (Sandbox Code Playgroud)
还要注意 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);
Run Code Online (Sandbox Code Playgroud)
输出
Foo(?i)Bar(?-i)Baz
Foo(?i:Bar)Baz
Run Code Online (Sandbox Code Playgroud)