6
votes

Ruby Regex, une seule capture (très simple!)

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] ]


3 commentaires

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


4 Réponses :


0
votes

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(/(.)/)


0 commentaires

9
votes

Parce que votre capture ne correspond que un caractère fort> unique. (.) + code> n'est pas le même que (. +) code> xxx pré>

si vous souhaitez correspondre à chaque caractère utilisez de manière récursive String # Numérum code> ou String # Split code> Si vous ne vous souciez pas des groupes de capture p>

à l'aide de numérisation: p>

str.match(reg).captures.map { |capture| [capture, str.index(capture), capture.size] }


2 commentaires

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.



1
votes

Oui, quelque chose d'important a été manqué; -)

(...) 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>

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 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(/(.)/­)


0 commentaires

0
votes

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]]


0 commentaires