Javascript 同一输入上Ruby和JS中不同和相同的正则表达式
这是输入行Javascript 同一输入上Ruby和JS中不同和相同的正则表达式,javascript,ruby,regex,Javascript,Ruby,Regex,这是输入行“!!!?” FIRST regex在Ruby和JS中的工作原理类似,它需要做什么?将此输入拆分为两行,分别包含“!”和“?”: 示例#1类ruby js/!+\124;\+/g RUBYs.scan(/!++\?++/).inspect的工作原理与JSs.match(/!++\?++/g)类似。 输出为:RUBY['!!!,'??'],JS[\“!!!\”,\“??\”] 示例#2 ruby不是js/([?!])\1*/ 在这里,ruby和js有不同的行为 RUBYs.scan(/(
“!!!?”
FIRST regex在Ruby和JS中的工作原理类似,它需要做什么?将此输入拆分为两行,分别包含“!”和“?”:
示例#1类ruby js/!+\124;\+/g
RUBYs.scan(/!++\?++/).inspect
的工作原理与JSs.match(/!++\?++/g)
类似。
输出为:RUBY['!!!,'??']
,JS[\“!!!\”,\“??\”]
示例#2 ruby不是js/([?!])\1*/
在这里,ruby和js有不同的行为
RUBYs.scan(/([?!])\1*/)
不等于JSs.match(/([?!])\1*/g)
。
RUBY返回两个数组[[\“!\”],[\“?\”]]
。
JS返回两个字符串,与示例#1['!!!','??']
中的一样
为什么/([?!])\1*/
在Ruby和JS中的行为不同
代码由于在模式中定义捕获组时仅返回捕获的子字符串,因此您应该修改模式以捕获整个匹配,并添加更多Ruby代码(已编辑):
这里,
([?!])\2*)
与/([?!])\1*/
匹配相同的文本,但是由于整个模式都用捕获括号括起来,因此对?
或的反向引用
现在的ID=2,因此\1
变成\2
。在块内部,可以通过m
(整个匹配)和n
(?
或!
)访问捕获的值。我们只收集完整的匹配项,因此每次匹配时,m
都会添加到匹配项中。@mudasobwa是的,这种速记方式会使它变短。万一有人想对第二个捕获组进行一些“技术”访问,扩展版本可能仍然有价值。扩展版本应该是“!!!?”。扫描(/([?!])\2*)/。注入({}){acc,(m,{uo)|acc@mudasobwa这很有趣。我在发帖的时候也跟着发了,我打赌你也会这么说,对吧?是的。我们可以叫@Stefan来确认:)@musefanmatch
只返回一个匹配项。@WiktorStribiżew:我不知道ruby,我只是觉得它看起来是正确的,但再看一眼,你似乎是正确的
s="!!!??"
matches = s.scan(/(([?!])\2*)/).inject([]) { |acc, (m, _)| acc << m }
puts matches
# = ['!!!', '??']
"!!!??".scan(/(([?!])\2*)/).map(&:first)