web-dev-qa-db-ja.com

文字列を正規表現に変換ruby

「/ [\ w\s] + /」などの文字列を正規表現に変換する必要があります。

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

次のような異なるRegexpメソッドを使用してみました。

Regexp.new("/[\w\s]+/") => /\/[w ]+\//、同様に_Regexp.compile_および_Regexp.escape_。しかし、私は期待どおりにそれらのいずれも返されません。

さらにバックスラッシュを削除してみました:

Regexp.new("[\w\s]+") => /[w ]+/しかし、運がない。

それから私はそれを簡単にしようとしました:

_str = "[\w\s]+"
=> "[w ]+"
_

逃げます。さて、文字列をそのままにして、正規表現オブジェクトに変換する方法はありますか?

110
cmthakur

ここでは、最初の文字列を一重引用符で囲む必要があります( このページ を参照)

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

明確にする

  /#{Regexp.quote(your_string_variable)}/

も働いています

編集:正確さのためにRegexp.quoteでyour_string_variableをラップしました。

128

このメソッドは、特別な意味を持つすべての文字を安全にエスケープします。

/#{Regexp.quote(your_string)}/

例えば、 .は、それ以外の場合は「任意の文字」として解釈されるため、エスケープされます。

バックスラッシュが特別な意味を持つ通常の文字列補間を開始する場合を除き、一重引用符で囲まれた文字列を使用することを忘れないでください。

34
sandstrom

%表記を使用:

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

または

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

help から:

%r []内挿された正規表現(終了デリミタの後にフラグを表示できます)

7
BitOfUniverse

Gem to_regexp が機能します。

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

修飾子も使用できます。

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

最後に、:detectを使用すると、より怠beになります。

'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/}
4
ryan