文字列を正規表現ルビに変換します


118

「/ [\ 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 ]+"

脱出。文字列をそのままにして、正規表現オブジェクトに変換するにはどうすればよいですか?

回答:



137

明確にするために

  /#{Regexp.quote(your_string_variable)}/

も働いています

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


3
のようにオプションをそのように追加できないことわかりました/#{your_regex}/#{options}
pduersteler 2014年

あなたはRailsについて話していると思いますか?optionsはハッシュであり、Rubyは動的ではありません=)
セルゲイゲラシモフ2014年

2
これは、OPがRuby 2.1で要求していることを実行せず、「[\ w \ s] +」を変換します=> / [w] + /
Luca Spiller

1
答えは2012年に与えられたことに注意してください:)その時点ですべてが完璧でした
セルゲイゲラシモフ2015年

4
完璧な年でした。
Naftuli Kay 2016

35

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

/#{Regexp.quote(your_string)}/

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

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


2
+.正規表現で解釈される記号(など)を含む可能性のある文字列変数を保護する方法を説明しているので、すばらしいです。
シャンシャンプリエ2014年

1
これは、OPがRuby 2.1で要求することを実行せず、「[\ w \ s] +」を変換します=> / [w \] \ + /
Luca Spiller

@LucaSpiller単一引用符で囲まれた文字列を使用する必要があります。バックスラッシュは二重引用符で囲まれた文字列では特殊文字として扱われます。これが、たとえば"\n"改行であるがそうで'\n'はない理由です。
sandstrom 2015

8

%表記を使用:

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

または

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

ヘルプから:

%r []補間された正規表現(終了区切り文字の後にフラグが表示される場合があります)


これは、OPがRuby 2.1で要求することを実行せず、「[\ w \ s] +」を変換します=> / [ws] + /
Luca Spiller

1
@Luca Spiller、ありがとうございます。そこでは単一引用符を使用してください。回答を更新します。
BitOfUniverse 2015年

5

宝石to_regexpがこの作業を行うことができます。

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

修飾子を使用することもできます。

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

最後に、:detectを使用して、より遅延させることができます

'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/}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.