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