Java Regex-是什么意思?

时间:2019-03-07 16:14:04

标签: java regex

我遇到了以下用Java代码编写的情况:

    String pattern = "(?i:U[A-Z0-9]C.*)";
    if (foo.matches(pattern))) {
    ...

我不明白?i:是什么意思。我见过(?i)用来表示不区分大小写,但不确定此处的格式。

感谢您的帮助!

3 个答案:

答案 0 :(得分:4)

Pattern的javadoc中,它定义为:

  

(?idmsuxU-idmsuxU)-什么都没有,但是变成了匹配标志i d m s u x U开-关

     

(?idmsux-idmsux:X)-X,作为具有给定标志i d m s u {{3}的非捕获组}开-关

在其余的正则表达式模式中,(?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
  • 决定
  • Uu必须是第一个字符
  • A-Za-z0-9将构成中间字符
  • Cc必须是最后一个字符

测试表明以下字符串全部通过:

  • 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>