Подтвердить что ты не робот

Какая разница между проверкой и совпадением строки Ruby

Я новичок в Ruby и всегда использовал String.scan для поиска первого вхождения числа. Странно, что возвращаемое значение находится в вложенном массиве, но я просто иду [0][0] для значений, которые я хочу. (Я уверен, что это имеет свою цель, просто я еще не использовал его.)

Я только узнал, что существует метод String.match. И это кажется более удобным, потому что возвращенный массив не вложен.

Вот пример двух: сначала сканирование:

>> 'a 1-night stay'.scan(/(a )?(\d*)[- ]night/i).to_a
=> [["a ", "1"]]

то соответствует

>> 'a 1-night stay'.match(/(a )?(\d*)[- ]night/i).to_a
=> ["a 1-night", "a ", "1"]

Я проверяю API, но я не могу отличить различие, так как оба относятся к "соответствовать шаблону".

Этот вопрос, просто из любопытства, о том, что scan может сделать, что match не может, и наоборот наоборот. Любой конкретный сценарий, который может выполнить только один? Является match ниже scan?

4b9b3361

Ответ 1

Короткий ответ: scan вернет все совпадения. Это не делает его превосходным, потому что если вам нужно только первое совпадение, str.match[2] читается намного лучше, чем 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"] 

Ответ 2

#scan возвращает все, что соответствует регулярному выражению.

#match возвращает первое совпадение как объект MatchData, который содержит данные, хранящиеся в специальных переменных, таких как $& (что соответствовало Regex; что какое отображение в индекс 0), $1 (соответствие 1), $2 и др.