J'apprends à connaître les expressions rationnelles Java et j'ai remarqué l'opérateur suivant:
\\*1
J'ai du mal à comprendre ce que cela signifie (la recherche sur le Web n'a pas aidé.) Par exemple, quelle est la différence entre ces deux options:
Pattern p1 = Pattern.compile("(a)\\1*"); // option1
Pattern p2 = Pattern.compile("(a)"); // option2
Matcher m1 = p1.matcher("a");
Matcher m2 = p2.matcher("a");
System.out.println(m1.group(0));
System.out.println(m2.group(0));
Résultat:
a
a
Merci!
\\1
est la référence arrière correspondant dans ce cas au premier groupe de capture qui est (a)
ici.
Donc, (a)\\1*
est équivalent à (a)a*
dans ce cas particulier.
Voici un exemple qui montre la différence:
Pattern p1 = Pattern.compile("(a)\\1*");
Pattern p2 = Pattern.compile("(a)");
Matcher m1 = p1.matcher("aa");
Matcher m2 = p2.matcher("aa");
m1.find();
System.out.println(m1.group());
m2.find();
System.out.println(m2.group());
Sortie:
aa
a
Comme vous pouvez le voir lorsque vous avez plusieurs a
, la première expression régulière capture tous les a
successifs, tandis que la seconde ne capture que la première.
\\1*
cherche a
encore, 0 fois ou plus. Cet exemple, peut-être plus facile à comprendre, utilise (a)\\1+
, qui recherche au moins 2 a
s:
Pattern p1 = Pattern.compile("(a)\\1+");
Matcher m1 = p1.matcher("aaaaabbaaabbba");
while (m1.find()) System.out.println(m1.group());
la sortie sera:
aaaaa
aaa
Mais la dernière a
ne correspondra pas car elle ne se répète pas.
En Perl,\1 à\9 sont toujours interprétés comme des références arrières; un nombre échappé par une barre oblique inversée supérieur à 9 est traité comme une référence arrière s'il existe au moins autant de sous-expressions, sinon il est interprété, si possible, comme un échappement octal. Dans cette classe, les échappements octaux doivent toujours commencer par un zéro. Dans cette classe,\1 à\9 sont toujours interprétés comme des références arrière. Un nombre plus grand est accepté comme référence arrière si au moins le même nombre de sous-expressions existe à cet endroit de l'expression régulière, sinon l'analyseur supprime les chiffres jusqu'à ce que le nombre est plus petit ou égal au nombre actuel de groupes ou est un chiffre.
À partir du Pattern docs.
Donc, il semble que p2
n’est bon que pour un "a"
alors que p1
est bon pour un nombre quelconque de "a"
tant qu’il en existe au moins un. L'étoile est X* X, zero or more times
. Cela s'appelle une étoile de Kleene.