ruby捕获方法和正则表达式

时间:2012-12-01 15:48:32

标签: ruby regex

我第一次遇到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

1 个答案:

答案 0 :(得分:4)

由于您只在正则表达式中指定了一个捕获组,因此它只返回它(作为包含“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"]