Java Regex - Что значит? I: значит? - PullRequest
1 голос
/ 07 марта 2019

Я обнаружил следующее условие, написанное на Java-коде:

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

Я не понимаю, что означает ?i:.Я видел (?i), используемый для обозначения нечувствительности к регистру, но не уверен насчет формы здесь.

Спасибо за любую помощь!

Ответы [ 3 ]

4 голосов
/ 07 марта 2019

В javadoc Pattern это определяется как:

(?idmsuxU-idmsuxU) - Ничего, но ходы совпадают с флагами i d m s u x U вкл. - выкл.

(?idmsux-idmsux:X) - X, как группа без захвата с заданными флагами i d m s и х вкл - выкл

Принимая во внимание, что (?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 голосов
/ 07 марта 2019

Согласно (?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

Здесь - это полезный сайт, который нарушает правила вашего шаблона регулярных выражений, а здесь - это полезный сайт, позволяющий проверить, должна ли строка пройти или потерпеть неудачу

0 голосов
/ 07 марта 2019

Вы видите Regex Встроенные модификаторы .

Модификаторы можно указывать в глобальной области видимости двумя способами:

  • Внешне, когда регулярное выражение
    впервые создано: new regex("asdf","i")
  • Внутренне, как отдельная встроенная конструкция в регулярном выражении: (?i)

Встроенные конструкторы-модификаторы являются глобальными в регулярном выражении и вступают в силу на
точка, в которой они происходят.Они остаются в силе, пока не встретится другой встроенный модификатор
, который изменяет флаг, как указано, с точки
, в которой они встречаются.

Затем существует конструкция модификатора локальной области видимости: (?i:)
, где расположены флаги (? <here> :) в рамках обычной конструкции без захвата group
.Влияние глобальных флагов временно изменяется с помощью флагов
, указанных в этой конструкции, и действует до выхода из области действия
, которая заканчивается в конце конструкции группы.

Малоизвестным фактом является то, что текущие global флаги фактически
выталкиваются и извлекаются из стека при входе / выходе из локальной области.

Так что если вы вызываете конструкцию глобального модификатора внутри локальной области видимости, она
отменяется, как только заканчивается область действия.
Т.е. (?i) (?-i: X Y (?-i) Z ) <here is insensitive>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...