Разные и одинаковые Regex в Ruby и JS на одном входе

1

Добрый день.

Это строка ввода "!!!??"

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/

  • 0
    @musefan match возвращает только одно совпадение.
  • 0
    @ WiktorStribiżew: я не знаю, ruby, я только что видел это и думал, что это выглядело правильно, но на второй взгляд кажется, что вы правы
Теги:

1 ответ

2
Лучший ответ

Поскольку 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 после каждого матча.

  • 1
    "!!!??".scan(/(([?!])\2*)/).map(&:first)
  • 0
    @mudasobwa Да, это сокращение сделает его короче. На тот случай, если кто-то захочет получить «технический» доступ ко второй группе захвата, расширенная версия все еще может иметь значение.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню