2014-02-16 60 views
2

使用Ruby 1.8.7我想在數據庫中存儲一些正則表達式,並在需要使用它們進行驗證時將它們輕鬆重組爲Regexp對象。我發現Ruby顯示出一些不需要的行爲。例如:來自變量的Ruby正則表達式

r = Regexp.new(/^\w+$/i)  => /^\w+$/i 
r_i = r.inspect     => "/^\\w+$/i" 
r_s = r.to_s     => "(?i-mx:^\\w+$)" 
r_from_r_i = Regexp.new(r_i) => /\/^\w+$\/i/ 
r_from_r_s = Regexp.new(r_s) => /(?i-mx:^\w+$)/ 
r == r_from_r_i     => false 
r == r_from_r_s     => false 

我想是能夠在數據庫中存儲Regexp的形式/pattern/options而不是(?options:pattern)格式,因爲我更熟悉前者。但是,當從一個變量創建一個新的Regexp時,模式變得很古怪。 Ruby正在逃避/ s - 因此該模式無效。

解析正則表達式時,有沒有什麼辦法讓Ruby兌現/pattern/options格式?

+1

真的,'r_s'有什麼問題?它不會與原來的相同,但其表現完全相同。 –

+0

@JanDvorak你是對的! –

+0

上面的更新示例突出顯示了真正的問題。當從一個字符串變量中加載一個正則表達式時,'/'s會被轉義,當我只是想讓'Regexp'對象解析我的模式和字符串時。 –

回答

7

您可以如下操作:

r = Regexp.new(/^\w+$/i) # => /^\w+$/i 
source,option = r.source,r.options # => ["^\\w+$", 1] 
regex = Regexp.new(source,option) 
regex == r # => true 

​​

返回集合對應於創建這個正則表達式

source

時所使用的選項位

返回模式的原始字符串現在

,如果你想要一個變量來保存你所有的正則表達式細節,然後再考慮如下:

r = Regexp.new(/^\w+$/i) # => /^\w+$/i 
source_option = r.source,r.options # => ["^\\w+$", 1] 
regex = Regexp.new(*source_option) 
regex == r # => true 

爲什麼你的falseto_sinspect

仔細閱讀文檔;你可以看到,Regexp.to_s是說:

返回一個包含正則表達式和選項(使用字符串(選:源)符號該字符串中的正則表達式被反饋::。 (但是,Regexp#==可能不會返回true比較兩者時,因爲正則表達式本身的來源可能會有所不同,如示例所示)。Regexp#inspect通常會產生更多rxp的可讀版本。

現在,請參閱:

r = Regexp.new(/^\w+$/i) # => /^\w+$/i 
r_s = r.to_s 
r_from_r_s = Regexp.new(r_s) 
r == r_from_r_s # => false 
# because the source strings are not same for r and r_from_r_s 
r.source # => "^\\w+$" 
r_from_r_s.source # => "(?i-mx:^\\w+$)" 

同樣的解釋如上適用於的r == r_from_r_i結果。

+0

感謝您的回答,但我認爲我發佈原始問題時並不清楚 - 這是深夜。問題是從一個字符串加載正則表達式 - 請參閱我更新的問題,並讓我知道是否有任何使Regexp對象以'/ pattern/options'形式解析我的完整正則表達式。謝謝! –

+0

@JoshM。在這麼多小時之後,請不要改變這個問題,這使我的努力現在完全模糊了。請回滾您的編輯。創建一個新帖子,我們會在那裏幫助你。 –

+0

雖然我發佈的原始示例不清楚,但文本是。我認爲... –