Je suis nouveau sur Ruby et j'ai toujours utilisé String.scan
pour rechercher la première occurrence d'un nombre. Il est assez étrange que la valeur renvoyée soit dans un tableau imbriqué, mais je vais simplement [0][0]
pour les valeurs que je veux. (Je suis sûr qu'il a son but, juste que je ne l'ai pas encore utilisé.)
Je viens de découvrir qu'il y a un String.match
méthode. Et cela semble plus pratique car le tableau retourné n'est pas imbriqué.
Voici un exemple des deux, le premier est le scan:
>> 'a 1-night stay'.scan(/(a )?(\d*)[- ]night/i).to_a
=> [["a ", "1"]]
alors correspond
>> 'a 1-night stay'.match(/(a )?(\d*)[- ]night/i).to_a
=> ["a 1-night", "a ", "1"]
J'ai vérifié l'API, mais je ne peux pas vraiment différencier la différence, car les deux se réfèrent à "correspondre au modèle".
Cette question est, par simple curiosité, sur ce que scan
peut faire que match
ne peut pas, et vice versa. Un scénario spécifique qu'un seul peut accomplir? match
est-il inférieur à scan
?
Réponse courte: scan
renverra toutes les correspondances. Cela ne le rend pas supérieur, car si vous ne voulez que la première correspondance, str.match[2]
lit beaucoup mieux que str.scan[0][1]
.
Ruby-1.9.2-p290 :002 > 'a 1-night stay, a 2-night stay'.scan(/(a )?(\d*)[- ]night/i).to_a
=> [["a ", "1"], ["a ", "2"]]
Ruby-1.9.2-p290 :004 > 'a 1-night stay, a 2-night stay'.match(/(a )?(\d*)[- ]night/i).to_a
=> ["a 1-night", "a ", "1"]
#scan
renvoie tout ce que le Regex correspond.
#match
renvoie la première correspondance sous la forme d'un objet MatchData
, qui contient des données détenues par des variables spéciales comme $&
(ce qui a été mis en correspondance par le Regex; c'est ce qui correspond à l'index 0), $1
(match 1), $2
, et al.