javascript - Ruby 和 JS 中相同输入的不同和相同正则表达式

标签 javascript ruby regex

这是输入行 "!!!??"

FIRST 正则表达式在 Ruby 和 JS 中的工作方式类似,并执行所需的操作,将此输入拆分为包含“!”的两行。和 ”?”分别是:

示例 #1 ruby​​ 类 js /!+|\?+/g

RUBY s.scan(/!+|\?+/).inspect 和 JS s.match(/!+|\?+/g) 一样工作。 输出为:RUBY [ '!!!', '??' ], JS [\"!!!\",\"??\"]

示例 #2 ruby​​ 不是 js /([?!])\1*/

这里ruby和js有不同的行为 RUBY s.scan(/([?!])\1*/) 不等于 JS s.match(/([?!])\1*/g)。 RUBY 返回两个数组 [[\"!\"], [\"?\"]]。 JS 返回两个字符串,如示例 #1 [ '!!!', '??' ]

为什么 /([?!])\1*/ 在 Ruby 和 JS 中表现不同?

代码 https://goo.gl/

最佳答案

scan只有在模式中定义了捕获组时才返回捕获的子字符串,您应该修改模式以捕获整个匹配项并添加更多 Ruby 代码(已编辑 as per this comment):

s="!!!??"
matches = s.scan(/(([?!])\2*)/).inject([]) { |acc, (m, _)| acc << m }
puts matches
# = ['!!!', '??']

参见 online Ruby demo .

根据 @mudasobwa's comment ,您甚至可以将其承包给

"!!!??".scan(/(([?!])\2*)/).map(&:first)

此处,(([?!])\2*)/([?!])\1*/ 匹配相同的文本,但由于整个模式用捕获括号包裹,对 ?! 的反向引用现在 ID=2,因此 \1 变成 \2。在 block 内,可以通过 m(整个匹配)和 n(?!)。我们只收集整个匹配项,因此 m 会在每次匹配时添加到 matches 中。

关于javascript - Ruby 和 JS 中相同输入的不同和相同正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47548744/

相关文章:

javascript - 为什么我的 Ajax 会调用两次 fire ?

javascript - .click() 事件时 'Open in new tab/window'

ruby-on-rails - 使用 Ruby Spreadsheet gem,我可以将单元格格式设置为货币吗?

arrays - 将数组与数组的数组合并

php - 将多个方括号值转换为数组php

ruby - 如何在某些类型的参数上使用 RSpec 正则表达式参数匹配

javascript - Coffeescript - 方法链与函数参数 [2] 或使用函数而不是参数

javascript - 如何在 React 中使用 App.tsx 而不是 App.js?

ruby-on-rails - 将 JSON 从 API 端点保存到 Ruby on Rails 应用程序中的数据库

ruby -/\s/未转义的空格