【问题标题】:ruby captures method and regexruby 捕获方法和正则表达式
【发布时间】:2012-12-01 23:52:56
【问题描述】:

我第一次在 Ruby 中遇到 MatchData#captures 方法,想问是否有人可以为我解释一下。 Ruby 文档说:

返回捕获数组;相当于mtch.to_a[1..-1]

但是,我目前正在对一个长字符串运行正则表达式,它似乎返回给我最后评估的项目?这有意义吗?

这是字符串:

431cdb7b1ad8183a1434b6d1a407731fac0ea61b8d720d733fefaa77f063df8e vidcoder [23/May/2012:01:17:16 +0000] 76.78.212.49 - B24DEA4883A9FF95 REST.GET.OBJECT accounts/6/videos/xboxcCFC/video.mp4 "GET /accounts/6/videos/xboxcCFC/video.mp4 HTTP/1.1" 206 - 2 697898511 56 56 "-" "Apple Mac OS X v10.6.8 CoreMedia v1.0.0.10K549" -

这是正则表达式:

line.match(%r{^.*\s+HTTP.*\s+-\s+(\d+)\s+}).captures

在这种情况下它返回数字 2

【问题讨论】:

    标签: ruby regex


    【解决方案1】:

    由于您在正则表达式中只指定了一个捕获组,因此它只返回它(作为包含“2”字符串的单元素数组,与直接返回“2”字符串不同):

    line.match(%r{^.*\s+HTTP.*\s+-\s+(\d+)\s+}).captures
    => ["2"]
    

    如果您尝试捕获更多元素,您的数组将包含更多元素,正如文档中所述:

    line.match(%r{^.*\s+HTTP(.*)\s+-\s+(\d+)\s+}).captures
    => ["/1.1\" 206", "2"] 
    

    【讨论】:

    • 好的,谢谢。似乎我需要更好地理解我的正则表达式,因为这决定了 captures 方法将返回什么?我注意到你放了 (.*) 导致 3 个元素被返回
    • @BC00 确实:每次你用 () 包围你的正则表达式的某些部分时,它表示你想捕获它以供以后使用。您可以在此处获得更多解释以及 Ruby 正则表达式测试器:rubular.com
    猜你喜欢
    • 2015-02-07
    • 2015-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多