2015-10-07 23 views
1

爲了將regex capture groups保存爲局部變量,正則表達式必須位於諸如/(?<somegroup>someregex)/ =~ 'somestring'之類的操作的左側。例如,給定一個URL字符串,提取該頂級域名:可能將變量傳遞給正則表達式然後捕獲匹配組到另一個局部變量?

/(?<extract>\b.com\b)[\/]{0,1}/ =~ 'google.com' 
puts extract # => .com 

有各種域(.org和.scb,的.wine,.ME等)。我的策略是將all possible tlds from a reputable source存儲在一個數組中,並遍歷每一個並將其傳遞給正則表達式。你如何將一個變量傳遞給文字?

這裏是什麼,我試圖做一個簡單的方法:

def example_extract(url_str) 
    exmpl = '.com' 
    regx = /(?<extract>\b#{exmpl}\b)[\/]{0,1}/ 
    regx =~ url_str 
    extract 
end 

example_extract('google.com') 
# => NameError: undefined local variable or method `extract' for main:Object 

我不變量傳遞給左手(文字)正則表達式操作。爲什麼我的捕獲組extract未定義?

回答

1

文檔下Regexp#=~,它說:

這種分配在Ruby語法分析器來實現。解析器檢測到賦值的'regexp-literal =〜expression'。正則表達式必須是文字,無插值,並放置在左側。

局部變量未分配的原因是因爲您的正則表達式是使用插值定義的,而不是文字。

正如引文所暗示的那樣,在解析階段完成分配局部變量,並且由於字符串插值是在運行時完成的,因此似乎沒有辦法繞開規範施加的限制。

+0

hmmmm ...看起來像這個問題的答案是一個大脂肪**不可能**。標記爲完整,並在未來的路上提出另一個問題。謝謝@sawa。 – binarymason

0

對於任何人的未來參考。你必須使用正則表達式的MatchData。這是什麼對我來說:

def example_extract(url_str) 
    exmpl = '.com' 
    regx = /(?<extract>\b#{exmpl}\b)[\/]{0,1}/ 
    extract = regx.match(url_str)[:extract] 
    p extract 
end 

example_extract('google.com') 
相關問題