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