Добрый день.
Это строка ввода "!!!??"
FREST регулярное выражение работает аналогично в Ruby и JS и делает то, что нужно для разделения этого входа для двух строк, содержит "!" а также "?" соответственно:
Пример # 1 ruby, как js /!+|\?+/g
s.scan(/!+|\?+/).inspect
s.match(/!+|\?+/g)
работы как JS s.match(/!+|\?+/g)
. Вывод: RUBY [ '!!!', '??' ]
[ '!!!', '??' ]
, JS [\"!!!\", \"??\"]
Пример # 2 ruby не js /([?!])\1*/
Здесь ruby и js имеют другое поведение s.scan(/([?!])\1*/)
не равное JS s.match(/([?!])\1*/g)
. Ruby возвращает два массива [[\"!\"], [\"?\"]]
. JS возвращает две строки так же, как в примере # 1 [ '!!!', '??' ]
[ '!!!', '??' ]
.
Почему /([?!])\1*/
действует по-разному в Ruby и JS?
Спасибо
PS: код https://goo.gl/
Поскольку scan
возвращает только захваченные подстроки, когда группа захватов определена/задана в шаблоне, вы должны изменить шаблон для захвата всего совпадения и добавить еще один код Ruby (отредактированный в соответствии с этим комментарием):
s="!!!??"
matches = s.scan(/(([?!])\2*)/).inject([]) { |acc, (m, _)| acc << m }
puts matches
# = ['!!!', '??']
См. Онлайн-версию Ruby.
Согласно комментарию @mudasobwa, вы можете даже договориться об этом с
"!!!??".scan(/(([?!])\2*)/).map(&:first)
Здесь (([?!])\2*)
совпадает с теми же текстами, что и /([?!])\1*/
, но поскольку весь шаблон обернут скотчами, скопируйте ссылку на ?
или !
теперь имеет ID = 2, поэтому \1
превращается в \2
. Внутри блока есть доступ как к захваченным значениям через m
(весь матч), так и n
(?
Или !
). Мы только собирать целые матчи, следовательно, m
добавляются matches
после каждого матча.
"!!!??".scan(/(([?!])\2*)/).map(&:first)
match
возвращает только одно совпадение.