我遇到了以下用Java代码编写的情况:
String pattern = "(?i:U[A-Z0-9]C.*)";
if (foo.matches(pattern))) {
...
我不明白?i:
是什么意思。我见过(?i)
用来表示不区分大小写,但不确定此处的格式。
感谢您的帮助!
答案 0 :(得分:4)
在Pattern
的javadoc中,它定义为:
在其余的正则表达式模式中,(?i)
将标志x打开,而(?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
答案 1 :(得分:2)
根据(?i:U[A-Z0-9]C.*)
,以下规则必须为真:
?i
U
或u
必须是第一个字符A-Z
或a-z
或0-9
将构成中间字符C
或c
必须是最后一个字符测试表明以下字符串全部通过:
UaC
uac
UAC
uAc
以下字符串失败:
baC
uAB
Uaac
UAaC
Here是一个有用的站点,可以用来打破正则表达式模式的规则,而here是一个有用的站点,可以检查字符串是否应该通过或失败
答案 2 :(得分:-2)
您看到的是Regex 内联修饰符。
可以在全局范围内以两种方式指定修饰符,
new regex("asdf","i")
(?i)
内联修饰符构造在正则表达式中是全局的,并在
处生效
它们发生的时间点。它们保持有效,直到另一个内联
遇到修饰符,从点开始更改标志的指定范围,
它们发生的位置。
然后有一个局部作用域修饰符构造: (?i:)
将标记(?<here>
:)放置在普通非捕获组中的位置
构造。全局标志的影响由
临时修改
此结构中指定的标志,并且在退出范围之前一直有效
它终止于组构造的末尾。
一个鲜为人知的事实是当前的global
标志实际上是
进入/离开本地范围时从堆栈中压入并弹出。
因此,如果您在本地范围内调用全局修饰符构造,则为
范围一结束就放弃。
即(?i) (?-i: X Y (?-i) Z ) <here is insensitive>