référence: https://stackoverflow.com/questions/17971466/java-regex-overlapping-matches
Normalement, lors de la mise en correspondance d'une expression régulière, la partie de chaîne de caractères adoptée dans une correspondance n'est pas utilisée deux fois dans une autre correspondance.
Par exemple, à partir de la chaîne " _apple_banana_cherry_
"
Si vous correspondez à / _ [^ _] + _ /
, vous pouvez obtenir deux choses, _apple_
et _cherry_
.
Si vous voulez utiliser le chevauchement "\ _" pour en prendre trois, _apple_
, _banana_
et _cherry_
, vous devez en spécifier un spécial.
Un moyen simple est d'utiliser le package d'expressions régulières regex
et de faire correspondre avec l'option ʻoverlapped = True`.
{.python}
>>> import regex as re
>>> re.findall("_[^_]+_", "_apple_banana_cherry_")
['_apple_', '_cherry_']
>>> re.findall("_[^_]+_", "_apple_banana_cherry_", overlapped=True)
['_apple_', '_banana_', '_cherry_']
Dans le cas de Java, il est facile d'utiliser le package d'expressions régulières standard et de décaler startIndex.
{.java}
Matcher m = Pattern.compile("_[^_]+(_)").matcher("_apple_banana_cherry_");
if (m.find()) {
do {
System.out.println(m.group());
} while (m.find(m.start(1)));
}
Commentaire:
Avec / _ [^ _] + (_) /
, le second _
apparaissant est entouré de ()
afin qu'il puisse être acquis comme groupe 1.
m.start (1)
renvoie le premier index du groupe 1.
«m.find (N)» signifie démarrer le match à partir du Nième caractère.
Donc m.find (m.start (1))
signifie démarrer m.find () à partir du premier index du groupe 1.
En d'autres termes, dans la deuxième boucle et les suivantes, la correspondance suivante est lancée à partir de «_» à la fin de la chaîne de caractères correspondante.
note: Il peut être plus facile d'utiliser un groupe nommé pour spécifier quel groupe sera le premier index pour la prochaine correspondance.
{.example}
(?<name>PATTERN)
Vous pouvez également avoir besoin d'un groupe sans capture pour des modèles de correspondance plus complexes.
{.example}
(?:PATTERN)
Recommended Posts