Question Faire correspondre toutes les occurrences d'une regex


Existe-t-il un moyen rapide de trouver chaque match d'une expression régulière dans Ruby? J'ai regardé l'objet Regex dans la STL Ruby et cherché sur Google en vain.


517
2017-09-17 05:46


origine


Réponses:


En utilisant scan devrait faire l'affaire:

string.scan(/regex/)

737
2017-09-17 05:53



Pour trouver toutes les chaînes correspondantes, utilisez scan méthode de String classe.

str = "A 54mpl3 string w1th 7 numb3rs scatter36 ar0und"
str.scan(/\d+/)
#=> ["54", "3", "1", "7", "3", "36", "0"]

Si vous préférez MatchData quel est le type de l'objet renvoyé par, match méthode de Regexp classes, utilisez ce qui suit

str.to_enum(:scan, /\d+/).map { Regexp.last_match }
#=> [#<MatchData "54">, #<MatchData "3">, #<MatchData "1">, #<MatchData "7">, #<MatchData "3">, #<MatchData "36">, #<MatchData "0">]

L'avantage d'avoir MatchData est que vous pouvez utiliser des méthodes comme offset

match_datas = str.to_enum(:scan, /\d+/).map { Regexp.last_match }
match_datas[0].offset(0)
#=> [2, 4]
match_datas[1].offset(0)
#=> [7, 8]

Reportez-vous également à ces questions si vous souhaitez en savoir plus
Comment puis-je obtenir les données de correspondance pour toutes les occurrences d'une expression régulière Ruby dans une chaîne?
Ruby expression régulière correspondant énumérateur avec prise en charge de la capture nommée
Comment trouver le point de départ de chaque match à ruby 

Lecture de variables spéciales $&, $', $1, $2 à ruby ​​sera super utile.


41
2018-03-12 22:42



si vous avez une expression rationnelle avec des groupes:

str="A 54mpl3 string w1th 7 numbers scatter3r ar0und"
re=/(\d+)[m-t]/

Vous utilisez la méthode scan of string pour rechercher les groupes correspondants:

str.scan re
#> [["54"], ["1"], ["3"]]

Pour trouver le motif correspondant:

str.to_enum(:scan,re).map {$&}
#> ["54m", "1t", "3r"]

6
2018-04-20 17:37