2014-09-10 24 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

相關問題