这是输入行 "!!!??"
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 中表现不同?
最佳答案
自 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/