Je suppose que ce sera une erreur idiote mais pour moi, le suivant retourne un tableau contenant uniquement "M". Voir ceci:
[ ["elliotpotts", 0, 11], ["sample.", 12, 7], ["com", 19, 3] ]
4 Réponses :
Il ne fait que renvoyer un personnage car c'est tout ce que vous avez demandé à cela. Vous voulez probablement utiliser Scan code> à la place:
str = "Many many characters!"
matches = str.scan(/(.)/)
Parce que votre capture ne correspond que un caractère fort> unique. si vous souhaitez correspondre à chaque caractère utilisez de manière récursive à l'aide de numérisation: p> (.) + code> n'est pas le même que
(. +) code>
String # Numérum code> ou
String # Split code> Si vous ne vous souciez pas des groupes de capture p>
str.match(reg).captures.map { |capture| [capture, str.index(capture), capture.size] }
Merci! J'ai également trouvé une réponse alternative et posterai-la maintenant. Merci!
Les deux extraits de code donnés ne fonctionnent pas correctement pour les compensations dans le cas général, ils ne fonctionnent que si les sous-chaînes correspondantes sont toutes différentes. Si, par exemple, il existe 3 correspondances pour "H", puis le même index (la première instance de 'H') est renvoyé tous les 3 fois. Le Str.index (Capture) renvoie l'index de la première instance de la sous-chaîne capturée.
Oui, quelque chose d'important a été manqué; -)
La clé est une "expression régulière globale", qui appliquera l'expression régulière plusieurs fois dans l'ordre. Dans Ruby, cela se fait avec Inverting de (...) code> introduit seulement un groupe de capture: le nombre de fois que le groupe correspond à l'index est déterminé car l'index est déterminé Seuls em> par l'expression régulière elle-même et non l'entrée. P>
REGEX # Match code> à
SCANNAGE # (code> (de nombreuses langues ont un modificateur d'expression régulier "/ g"): P>
"Many many charaÂcters!".scÂan(/(.)+?/Â)
# but more simply (or see answers using String#split)
"Many many charaÂcters!".scÂan(/(.)/Â)
Le code suivant est de Obtenir l'index des résultats de la numérisation de chaîne dans Ruby et modifié pour mon goût.
[].tap {|results| "abab".scan(/a/) {|capture| results.push(([capture, Regexp::last_match.offset(0)]).flatten) } } => [["a", 0], ["a", 2]]
Je viens de voir votre édition, capturer des groupes de balayage sont stockés dans des tableaux séparés, essayez simplement votre REGEXP et une chaîne de test en IRB que vous verrez. Les réponses sont toujours identiques avec votre édition incluse
Il suffit de voir votre prochain édition, vous devrez mettre à jour avec plus d'informations. Je suis un peu confus maintenant: P N'hésitez pas à jeter un exemple plus complet, peu importe la façon dont vous savez que nous savons exactement ce que vous devez extraire
D'accord, mis à jour ma réponse avec votre dernière modification. Je suis un peu attaché pour le moment pour le moment, il ne s'agit que de la solution complète sans explication, laissez-moi savoir si cela n'a pas de sens et je vais le mettre à jour