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]
调用它,等
答
检查:
"Name: Gray, James"[0] # => "N"
"Name: Gray, James"[/w*/] # => "Name"
在ruby中,可以通过索引访问字符串,该索引可以接受多种类型的对象,也可以使用正则表达式。
看看语言reference。
太棒了,谢谢。还有一个简单的问题:什么是$〜和$&?它看起来像$〜获得下一场比赛? – Robert
'$〜'包含刚刚完成的比赛的全部信息。你可以从中提取你想要的任何东西,包括所有匹配,初始位置,结束位置等。$&是与正则表达式匹配的整个子字符串。 – sawa
哦,好的。再次感谢! – Robert