Рубин (1.9.3) документации, кажется, подразумевает, что сканирование эквивалентно = ~ кроме того, чторубин регулярное выражение сканирования по сравнению с = ~
- сканирования возвращает несколько совпадений, а = ~ возвращает только первое вхождение, и
- scan возвращает данные сопоставления, а = ~ возвращает индекс.
Однако в следующем примере два метода возвращают разные результаты для одной и той же строки и выражения. Почему это?
1.9.3p0 :002 > str = "Perl and Python - the two languages"
=> "Perl and Python - the two languages"
1.9.3p0 :008 > exp = /P(erl|ython)/
=> /P(erl|ython)/
1.9.3p0 :009 > str =~ exp
=> 0
1.9.3p0 :010 > str.scan exp
=> [["erl"], ["ython"]]
Если индекс первого матча 0, не следует сканировать возвращение «Perl» и «Python» вместо «Эрл» и «питон»?
Благодаря
Спасибо, поэтому сканирование строго не эквивалентно = ~, когда есть группы, участвующие? – Anand
@Anand Поскольку сканирование возвращает что-то совершенно иное, чем = ~, я не думаю, что когда-либо точно сказать, что они эквивалентны. Первым результатом, возвращаемым сканированием, будет подстрока, начинающаяся с индекса 'str = ~ exp' тогда и только тогда, когда' exp' не содержит группы захвата. В дополнение к этому вы также можете сказать, что первый результат будет эквивалентен 'Regexp.last_match.string' после выполнения' str = ~ exp', если он не содержит групп захвата и 'Regexp.last_match.captures', если он содержит группы захвата. – sepp2k
Рад видеть этот пост, от которого вы действительно можете учиться. – texasbruce