web-dev-qa-db-fra.com

Comment capturer plusieurs groupes répétés?

Je dois capturer plusieurs groupes du même motif. Supposons que j'ai une chaîne suivante:

HELLO,THERE,WORLD

Et j'ai écrit un motif suivant 

^(?:([A-Z]+),?)+$

Ce que je veux, c’est capturer chaque mot, de sorte que le groupe 1 soit: "BONJOUR", le groupe 2, "THERE" et le groupe 3, "MONDE". MONDE".

Je teste mon expression régulière ici et je veux l'utiliser avec Swift (il existe peut-être un moyen dans Swift d'obtenir des résultats intermédiaires d'une manière ou d'une autre, afin que je puisse les utiliser?)

UPDATE: Je ne veux pas utiliser split. J'ai juste besoin de savoir comment capturer tous les groupes qui correspondent au modèle, pas seulement le dernier.

28
phbelov

Avec un groupe dans le motif, vous ne pouvez obtenir qu'un seul résultat exact dans ce groupe. Si votre groupe de capture est répété par le modèle (vous avez utilisé le quantificateur + sur le groupe non capturé environnant), seule la dernière valeur qui correspond à celle-ci est enregistrée.

Vous devez utiliser les fonctions d'implémentation de regex de votre langage pour trouver toutes les correspondances d'un motif, puis supprimer les ancres et le quantificateur du groupe sans capture bien).

Vous pouvez également développer votre expression rationnelle et laisser le modèle contenir un groupe de capture par groupe que vous souhaitez inclure dans le résultat:

^([A-Z]+),([A-Z]+),([A-Z]+)$
23
Byte Commander

Juste pour fournir un exemple supplémentaire du paragraphe 2 dans la réponse. Je ne sais pas à quel point il est essentiel pour vous de former trois groupes en un match plutôt que trois matches avec un groupe. Par exemple, en groovy:

def subject = "HELLO,THERE,WORLD"
def pat = "([A-Z]+)"
def m = (subject =~ pat)
m.eachWithIndex{ g,i ->
  println "Match #$i: ${g[1]}"
}

Match #0: HELLO
Match #1: THERE
Match #2: WORLD
1
AndyJ

Je pense que vous avez besoin de quelque chose comme ça ....

b="HELLO,THERE,WORLD"
re.findall('[\w]+',b)

Ce qui dans Python3 retournera

['HELLO', 'THERE', 'WORLD']
0
Tim Seed