web-dev-qa-db-fra.com

Correspond à toutes les occurrences d'une regex

Existe-t-il un moyen rapide de trouver chaque correspondance d'une expression régulière dans Ruby? J'ai parcouru l'objet Regex dans la Ruby STL et ai effectué des recherches sur Google, mais en vain.

566
Chris Bunch

Utiliser scan devrait faire l'affaire:

string.scan(/regex/)
796
Jean

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

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

Si vous voulez plutôt MatchData qui est le type de l'objet renvoyé par, la méthode match 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 telles que 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 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 à l'énumérateur avec prise en charge de la capture nommée
Comment trouver le point de départ de chaque match en Ruby

Lire à propos des variables spéciales $&, $', $1, $2 dans Ruby sera très utile.

62
sudo bangbang

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 des groupes correspondants:

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

Pour trouver le motif correspondant:

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