web-dev-qa-db-fra.com

Quelle est la différence entre l'analyse et la correspondance sur la chaîne Ruby

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?

43
lulalala

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"] 
52
Jonathan Julian

#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.

21
unrelativity