加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-17 02:32:40 所属栏目:百科 来源:网络整理
导读:我正在浏览about_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",$2end 在我看来,
我正在浏览about_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,(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,$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]等调用它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读