Какая разница между проверкой и совпадением строки 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
?
Ответы
Ответ 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
и др.