美好的一天。
这是输入行"!!!??"
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/
答案 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
。