Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/32.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
Ruby Koans:regex括号;捕获“;匹配内容?_Ruby - Fatal编程技术网

Ruby Koans:regex括号;捕获“;匹配内容?

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 在我看来,在正则表达式中使用

我正在浏览关于_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
在我看来,在正则表达式中使用括号会在幕后创建两个新变量($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"