Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 同一输入上Ruby和JS中不同和相同的正则表达式_Javascript_Ruby_Regex - Fatal编程技术网

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

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中的行为不同

代码

由于在模式中定义捕获组时仅返回捕获的子字符串,因此您应该修改模式以捕获整个匹配,并添加更多Ruby代码(已编辑):


这里,
([?!])\2*)
/([?!])\1*/
匹配相同的文本,但是由于整个模式都用捕获括号括起来,因此对
的反向引用
现在的ID=2,因此
\1
变成
\2
。在块内部,可以通过
m
(整个匹配)和
n
)访问捕获的值。我们只收集完整的匹配项,因此每次匹配时,
m
都会添加到
匹配项中。

@mudasobwa是的,这种速记方式会使它变短。万一有人想对第二个捕获组进行一些“技术”访问,扩展版本可能仍然有价值。扩展版本应该是
“!!!?”。扫描(/([?!])\2*)/。注入({}){acc,(m,{uo)|acc@mudasobwa这很有趣。我在发帖的时候也跟着发了,我打赌你也会这么说,对吧?是的。我们可以叫@Stefan来确认:)@musefan
match
只返回一个匹配项。@WiktorStribiżew:我不知道ruby,我只是觉得它看起来是正确的,但再看一眼,你似乎是正确的
s="!!!??"
matches = s.scan(/(([?!])\2*)/).inject([]) { |acc, (m, _)| acc << m }
puts matches
# = ['!!!', '??']
"!!!??".scan(/(([?!])\2*)/).map(&:first)