1
我试图从具有相对长正则表达式的文本行中提取信息。以下是描述问题的简化正则表达式。在Ruby的正则表达式中命名捕获
line = "Internet 10.9.68.178 127 c07b.bce9.7d41 ARPA Vlan2"
如果我尝试的情况下直接试图“拯救”正则表达式到一个变量相匹配这一行,它工作得很好:
[223] pry(main)> /Internet\s+(?<ipaddr>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/ =~ line
=> 0
[224] pry(main)> ipaddr
=> "10.9.68.178"
[225] pry(main)> $1
=> "10.9.68.178"
现在,当我尝试做“同样的事情正则表达式的存储”版本,它悲惨的失败了:
[226] pry(main)> ipaddr = nil # ensure that it's cleared before match
[227] pry(main)> myreg = /Internet\s+(?<ipaddr>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/
=> /Internet\s+(?<ipaddr>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/
[228] pry(main)> myreg =~ line
=> 0
[229] pry(main)> ipaddr
=> nil
[230] pry(main)> $1
=> "10.9.68.178"
我也试图直接match
方法调用,它似乎工作:
[231] pry(main)> myreg.match(line)
=> #<MatchData "Internet 10.9.68.178" ipaddr:"10.9.68.178">
但是这意味着一个简单的if
声明,我需要做这样的事情:的
if m = myreg.match(line)
do_stuff m[:ipaddr]
end
,而不是简单地
if myreg =~ line
do_stuff ipaddr
end
任何想法,为什么名称不正确捕获这个实例?
谢谢,我浏览了该页面多次,不知何故仍然错过了... ... - – skrobul 2014-09-10 09:43:27