2014-09-10 46 views
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 

任何想法,为什么名称不正确捕获这个实例?

回答

1

有趣。我在Ruby Documentation里查了这个。

它说:如果正则表达式是不是文字不会发生

分配。

这就是为什么/Internet\s+(?<ipaddr>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/ =~ line有效,但myreg =~ line没有。

谢谢你让我学到新东西。 :)

+0

谢谢,我浏览了该页面多次,不知何故仍然错过了... ... - – skrobul 2014-09-10 09:43:27