L'obtention de tous les sous-groupes avec une regex match
Compte tenu de la chaîne:
© 2010 Women’s Flat Track Derby Association (WFTDA)
Je veux:
2010 -- Women's -- Flat
Women's -- Flat -- Track
Track -- Derby -- Association
Je suis en utilisant les regex:
([a-zA-Z]+)\s([A-Z][a-z]*)\s([a-zA-Z]+)
C'est seulement de retour:
s -- Flat -- Track
Quelle langue utilisez-vous?
Désolé - c'est ultraedit JS, javascript serait probablement travailler.
Désolé - c'est ultraedit JS, javascript serait probablement travailler.
OriginalL'auteur Caveatrob | 2010-11-16
Vous devez vous connecter pour publier un commentaire.
Ce problème n'est pas simple, mais de comprendre pourquoi, vous devez comprendre comment le moteur d'expression régulière fonctionne sur votre chaîne.
Considérons le modèle
[a-z]{3}
(match 3 successive des caractères compris entre a et z) sur la chaîne cibleabcdef
. Le moteur démarre à partir de la partie gauche de la chaîne (avant lea
), et voit quea
correspond[a-z]
, il avance d'une position. Puis, il voit queb
correspond[a-z]
et avances à nouveau. Enfin, il voit quec
des allumettes, des avances à nouveau (avantd
) et renvoieabc
comme un match.Si le moteur est mis en place pour le retour des correspondances multiples, il va maintenant essayer de faire correspondre à nouveau, mais il tient ses informations de position (donc, comme ci-dessus, il va correspondre et retour
def
).Parce que le moteur a déjà déplacé au-delà du
b
bien que correspondant àabc
,bcd
ne sera jamais considéré comme un match. Pour cette même raison, dans votre expression, une fois un groupe de mots est mis en correspondance, le moteur ne considère jamais les mots dans le premier match à être une partie de la suivante.Pour contourner ce problème, vous devez utiliser la capture des groupes à l'intérieur de lookaheads pour recueillir l'appariement des mots qui apparaissent plus tard dans la chaîne:
Il en résulte:
Le voir en action à http://jsfiddle.net/jRgXm/.
L'expression régulière recherches pour ce qui vous semble être la définition d'un mot
([a-z0-9']+)
, et capture en sous-groupe 1, puis utilise une anticipation (ce qui est d'une largeur nulle affirmation, donc ça ne fait pas avancer le moteur du curseur), qui capture les deux mots en sous-groupes 2 et 3.Cependant, si vous êtes en utilisant le moteur Javascript, vous doit
RegExp.exec
et en boucle sur les résultats (voir cette question pour discuter pourquoi). Je ne sais pas comment UltraEdit du moteur est mis en œuvre, mais nous espérons qu'elle puisse faire une recherche globale et aussi de recueillir des sous-groupes.OriginalL'auteur Daniel Vandersluis
Je suis en utilisant certains génériques regex tester, donc je ne peux pas garantir qu'il fonctionnera pour vous, mais...
Trois mots commençant par un numéro ou une lettre majuscule suivie par les lettres/chiffres ou que funky apostrophe, séparés par des espaces. Fonctionne pour moi.
Edit: je suppose que vous pouvez parcourir, en répétant le matcher en JS je n'ai jamais utilisé.
Ne fonctionne pas; les expressions régulières, les matchs ne se chevauchent. Voir ma réponse pour plus d'info.
OriginalL'auteur josh.trow