3 votes

Java Regex - Que signifie ?i: ?

Je suis tombé sur la condition suivante écrite en code Java :

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

Je ne comprends pas ce que le ?i: signifie. J'ai déjà vu (?i) utilisé pour indiquer l'insensibilité à la casse, mais pas sûr de la forme ici.

Merci pour toute aide !

8voto

Andreas Points 3334

Dans la javadoc de Pattern il est défini comme suit :

(?idmsuxU-idmsuxU) - Rien, mais des drapeaux de correspondance i d m s u x U marche - arrêt

(?idmsux-idmsux:X) - X, en tant que groupe non capturant avec les drapeaux donnés i d m s u x marche - arrêt

Considérant que (?i) tourne le drapeau CASE_INSENSITIVE pour le reste du motif regex, (?i:X) n'active le drapeau que pour X .

Par exemple, ce sont les mêmes 1 :

Foo(?i)Bar(?-i)Baz
Foo(?i:Bar)Baz

Notez également le commentaire suivant dans la javadoc :

En Perl, les drapeaux incorporés au niveau supérieur d'une expression affectent l'expression entière. Dans cette classe, les drapeaux intégrés prennent toujours effet au point où ils apparaissent, qu'ils soient au niveau supérieur ou dans un groupe ; dans ce dernier cas, les drapeaux sont restaurés à la fin du groupe, comme en Perl.

1) Cela ne signifie pas que (?i)X(?-i) y (?i:X) est toujours le même, voir les commentaires.


UPDATE - Preuve :

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);

Sortie

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

2voto

Manaar Points 184

Selon (?i:U[A-Z0-9]C.*) les règles suivantes doivent être vraies :

  • Insensible à la casse, déterminé par ?i
  • U ou u doit être le premier caractère
  • A-Z ou a-z ou 0-9 constituera le personnage central
  • C ou c doit être le dernier caractère

Les tests montrent que les chaînes suivantes passent toutes :

  • UaC
  • uac
  • UAC
  • uAc

Et les chaînes suivantes échouent :

  • baC
  • uAB
  • Uaac
  • UAaC

Aquí est un site utile pour décomposer les règles de votre modèle regex et ici est un site utile pour vérifier si une chaîne doit passer ou échouer

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X