Ruby和JS中的不同和相同的Regex在相同的输入上

时间:2017-11-29 09:01:20

标签: javascript ruby regex

美好的一天。

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

FIRST正则表达式在Ruby和JS中的工作方式类似,并且做了它需要做的事情,将这个输入分成两行包含"!"和"?"分别为:

示例#1 ruby​​ like 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中的行为不同?

谢谢

PS:代码https://goo.gl/

1 个答案:

答案 0 :(得分:2)

由于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。在块内,可以通过m(整个匹配)和n?!)访问捕获的值。我们只收集整个匹配项,因此每次匹配时m都会添加到matches