Java 正则表达式 - ?i: 代表什么意思?

3
我遇到了以下Java代码中写的条件:
    String pattern = "(?i:U[A-Z0-9]C.*)";
    if (foo.matches(pattern))) {
    ...

我不理解?i:的含义。我曾见过(?i)表示大小写不敏感,但这里的形式我不确定。
谢谢任何帮助!

这是一个重复的吗?"?i:"和"(?i)"是一样的吗? - The Gilbert Arenas Dagger
@FredLarson 我已经将它标记为那个问题的重复了。但它并不是。 - Benjamin Urquhart
2个回答

8
Pattern 的 javadoc 中,定义了以下内容:

(?idmsuxU-idmsuxU) - 什么也不做,但可以打开或关闭匹配标志:i, d, m, s, u, x, U

(?idmsux-idmsux:X) - 作为非捕获组出现,可在给定的标志idmsux开关中打开标志,- 代表关闭

(?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

2
根据(?i:U[A-Z0-9]C.*),以下规则必须为真:
  • 不区分大小写,由?i确定
  • Uu必须是第一个字符
  • 中间字符由A-Za-z0-9组成
  • Cc必须是最后一个字符
测试显示以下字符串都可以通过:
  • UaC
  • uac
  • UAC
  • uAc
以下字符串失败:
  • baC
  • uAB
  • Uaac
  • UAaC
这里有一个有用的网站可以解释您的正则表达式模式的规则,这里有一个有用的网站可以检查字符串是否应该通过或失败。"Original Answer"翻译成"最初的回答"。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接