Ruby Koans:正则表达式括号“捕获”匹配的内容?

问题描述:

我经历about_regular_expressions.rb,不明白到底这里发生了什么:Ruby Koans:正则表达式括号“捕获”匹配的内容?

def test_variables_can_also_be_used_to_access_captures 
    assert_equal "Gray, James", "Name: Gray, James"[/(\w+), (\w+)/] 
    assert_equal "Gray", $1 
    assert_equal "James", $2 
end 

似乎对我来说,在正则表达式中使用括号中的引擎盖下创建两个新变量(1美元和2美元)。

这是正确的吗?

但后来我这样做:

def test_variables_can_also_be_used_to_access_captures 
    assert_equal "Gray, James", "Name: Gray, James"[/(\w+), (\w+)/] 
    assert_equal "Smith, Bobert", "Name: Smith, Bobert"[/(\w+), (\w+)/] 
    assert_equal "Smith", $1 
    assert_equal "Bobert", $2 
end 

它拍摄 “史密斯” 和 “Bobert”。每次使用带括号的新正则表达式时,我想前面的值只是被覆盖了?

如果我再尝试捕捉只是一个字:

def test_variables_can_also_be_used_to_access_captures 
    assert_equal "Gray, James", "Name: Gray, James"[/(\w+), (\w+)/] 
    assert_equal "Smith, Bobert", "Name: Smith, Bobert"[/(\w+), (\w+)/] 
    assert_equal "Smith", $1 
    assert_equal "Bobert", $2 
    assert_equal "Susan,", "Name: Susan, whatever"[/(\w+),/] 
    assert_equal "Susan", $1 
    assert_equal nil, $2 
end 

$ 2不见了......(没有更多的“Bobert”)

任何人都可以摆脱对引擎盖下会发生什么一些轻? 或者指点我正确的方向?

你说得对。每次匹配正则表达式时,全局变量$~, $&, ..., $1, $2, ...将被覆盖。在你的最后一个例子中,正则表达式没有任何东西匹配$2,因为它没有第二个(...)的位置,所以nil被分配为$2

当您想交错使用多个匹配的结果时,我使用的技术是将匹配数据保留为变量。也就是说,在第一次正则表达式匹配后,立即分配一个变量match1 = $~。然后,继续下一个正则表达式匹配,并执行match2 = $~,依此类推。稍后,您可以从这些变量中提取匹配的结果。例如,做几个正则表达式匹配后,如果您想重提这是在第一次的正则表达式匹配分配$1的结果,您可以通过match1[1]调用它,等

+0

太棒了,谢谢。还有一个简单的问题:什么是$〜和$&?它看起来像$〜获得下一场比赛? – Robert

+1

'$〜'包含刚刚完成的比赛的全部信息。你可以从中提取你想要的任何东西,包括所有匹配,初始位置,结束位置等。$&是与正则表达式匹配的整个子字符串。 – sawa

+0

哦,好的。再次感谢! – Robert

检查:

"Name: Gray, James"[0] # => "N" 
"Name: Gray, James"[/w*/] # => "Name" 

在ruby中,可以通过索引访问字符串,该索引可以接受多种类型的对象,也可以使用正则表达式。

看看语言reference