2011-12-28 80 views
91

我需要將字符串「/ [\ w \ s] + /」轉換爲正則表達式。將字符串轉換爲正則表達式ruby

"/[\w\s]+/" => /[\w\s]+/ 

我試圖使用像不同Regexp方法:

Regexp.new("/[\w\s]+/") => /\/[w ]+\//,類似地Regexp.compileRegexp.escape。但他們沒有一個像我預期的那樣回報。

進一步我試圖消除反斜線:

Regexp.new("[\w\s]+") => /[w ]+/但沒有運氣。

然後我試圖做到這一點很簡單:

str = "[\w\s]+" 
=> "[w ]+" 

它逃脫。現在字符串如何保持原樣並轉換爲正則表達式對象?

回答

111

看起來在這裏你需要的初始字符串是用單引號(參考this page

>> str = '[\w\s]+' 
=> "[\\w\\s]+" 
>> Regexp.new str 
=> /[\w\s]+/ 
115

要清楚

/#{Regexp.quote(your_string_variable)}/ 

是工作壓力太大

編輯:包裹爲了正確性,使用Regexp.quote中的your_string_variable。

+2

剛剛發現,你_can't_追加這樣的選項,比如'/#{your_regex} /#{options}'。 – pduersteler

+0

我想你說的是Rails? 'options'是一個哈希,而Ruby不是那麼動態=) –

+0

啊,是的。我試着通過它「ix」:) – pduersteler

33

此方法將安全逃離的所有字符的特殊含義:

/#{Regexp.quote(your_string)}/ 

例如,.將被轉義,因爲它以其他方式解釋爲「任何字符」。

請記住使用一個單引號的字符串,除非您想要經常插入字符串,其中反斜槓有特殊含義。

+2

不錯,因爲它解釋了我們如何保護可能包含將在正則表達式中解釋的符號(例如'+ .')的字符串變量。 – rchampourlier

+1

這並不是OP在Ruby 2.1上所要求的,它會轉換「[\ w \ s] +」=>/\ [w \\] \ +/ –

+0

@LucaSpiller您需要使用單引號字符串,反斜槓被視爲雙引號字符串中的特殊字符,這就是爲什麼例如'「\ n」'是換行符,但'\ n''不是。 – sandstrom

5

使用%表示法:

%r{\w+}m => /\w+/m 

regex_string = '\W+' 
%r[#{regex_string}] 

help

%R []內插的正則表達式(標誌可以關閉 分隔符之後出現)

+0

這不是OP在Ruby 2.1上所要求的,它會轉換「[\ w \ s] +」=>/[ws] +/ –

+0

@Luca Spiller,謝謝,單引號應該用在那裏,我會更新答案。 – BitOfUniverse

2

該寶石to_regexp可以做的工作。

"/[\w\s]+/".to_regexp => /[\w\s]+/ 

您還可以使用修改器:

'/foo/i'.to_regexp => /foo/i 

最後,你可以更懶使用:檢測

'foo'.to_regexp(detect: true)  #=> /foo/ 
'foo\b'.to_regexp(detect: true) #=> %r{foo\\b} 
'/foo\b/'.to_regexp(detect: true) #=> %r{foo\b} 
'foo\b/'.to_regexp(detect: true) #=> %r{foo\\b/} 
相關問題