Ruby Koans:regex括号;捕获“;匹配内容?
我正在浏览关于_regular _expressions.rb的内容,不太明白这里到底发生了什么:Ruby Koans:regex括号;捕获“;匹配内容?,ruby,Ruby,我正在浏览关于_regular _expressions.rb的内容,不太明白这里到底发生了什么: 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 在我看来,在正则表达式中使用
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
它抓住了“史密斯”和“波伯特”。我猜每次使用带括号的新正则表达式时,前面的值都会被覆盖
如果我试着抓住一个词:
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美元不见了。。。(不再是“博伯特”)
有人能解释一下引擎盖下发生了什么吗?
或者给我指出正确的方向?你说得对。每次匹配正则表达式时,都会覆盖全局变量
$~,$&,$1,$2,…
。在上一个示例中,正则表达式没有与$2
匹配的任何内容,因为它没有第二个(…)
位置,因此为$2
分配了nil
当您想要交错使用来自多个匹配的结果时,我使用的技术是将匹配数据作为变量保存。也就是说,在第一个正则表达式匹配之后,立即分配一个变量match1=$~
。然后,继续下一个正则表达式匹配并执行match2=$~
,依此类推。稍后,您可以从这些变量中提取匹配的结果。例如,在进行了几次正则表达式匹配之后,如果您想返回在第一次正则表达式匹配时分配的$1
的结果,您可以通过match1[1]
等方式调用它。检查此项:
在ruby中,可以通过索引访问字符串,该索引接受广泛类型的对象,也包括regexp
看看这门语言。太棒了,谢谢。还有一个简单的问题:$~和$&是什么?看起来$~获得了下一个匹配?
$~
保存了刚刚完成的匹配的全部信息。您可以从中提取所需的任何内容,包括所有匹配项、初始位置、结束位置等。$&
是与正则表达式匹配的整个子字符串。
"Name: Gray, James"[0] # => "N"
"Name: Gray, James"[/w*/] # => "Name"