文字列を正規表現に補間する


160

Rubyの正規表現に文字列の値を代入する必要があります。これを行う簡単な方法はありますか?例えば:

foo = "0.0.0.0"
goo = "here is some other stuff 0.0.0.0" 
if goo =~ /value of foo here dynamically/
  puts "success!"
end

fooがgooのサブストリングかどうかを確認しようとしていますか?あなたが何を求めているのかはっきりしないと思います。
Neall 2008

もしそうなら、goo.include?(foo)で十分です!
glenn mcdonald

1
いいえ、fooがgooのサブストリングであるかどうかを確認しようとしていませんでした。また、キャプチャもいくつか行う必要があったため、includeが機能しませんでした。
Chris Bunch

回答:



125

ジョンLの答えが重要であることRegexp.quoteに注意してください!

if goo =~ /#{Regexp.quote(foo)}/

「明白な」バージョンを実行する場合:

if goo =~ /#{foo}/

次に、一致テキストのピリオドは正規表現のワイルドカードとして扱われ、と"0.0.0.0"一致し"0a0b0c0"ます。

また、本当に部分文字列の一致を確認したいだけの場合は、

if goo.include?(foo)

追加の引用符や特殊文字について心配する必要はありません。


3
.quote()文字列を使用して正規表現を作成する場合は、逆の(を使用しない)も役立ちます。
Jesse

「本当に部分文字列の一致を確認したいだけのif goo.include?(foo)場合は、存在を確認する必要がある場合は、単に「=> True」で実行できます。String.gsubを置き換えて既に使用している場合は、Regexp.quoteが唯一のオプションとなる場合があります。
Isaac Betesh 2013

はっきりしない場合に備えて、Jesseに追加するだけです。Regexp.newつまり、エスケープする必要のない文字列をやに渡すだけRegexp.compileです。
dylankb 2017年

Regexp.quoteを使用する理由についての有益な説明をありがとう
Wylliam Judd '22

7

おそらくRegexp.escape(foo)出発点でしょうが、従来の式補間を使用できないという正当な理由はあり"my stuff #{mysubstitutionvariable}"ますか?

また、!goo.match(foo).nil?リテラル文字列と一緒に使用することもできます。




3

これは限られた便利な他の答えです:

入力文字列に単一引用符を使用した場合、Regexp.quoteまたはRegexp.escapeを使用せずに簡単に正規表現に挿入できることを発見しました:(IPアドレスの一致)

IP_REGEX = '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}'

my_str = "192.0.89.234 blahblah text 1.2, 1.4" # get the first ssh key 
# replace the ip, for demonstration
my_str.gsub!(/#{IP_REGEX}/,"192.0.2.0") 
puts my_str # "192.0.2.0 blahblah text 1.2, 1.4"

一重引用符は\\と\ 'のみを解釈します。

http://en.wikibooks.org/wiki/Ruby_Programming/Strings#Single_quotes

これは、正規表現の同じ長い部分を数回使用する必要があるときに役立ちました。普遍的ではありませんが、質問の例に当てはまると思います。


ここでの投稿についてどう思うか知りたいですが、今のところここまで見られるとは思えません。
Plasmarob 2013年

-2
foo = "0.0.0.0"
goo = "here is some other stuff 0.0.0.0" 

puts "success!" if goo =~ /#{foo}/

2
いいえ、ドットは正規表現のワイルドカードであるため、「ここに他の何か070x0!0があります」という誤った「true」が表示されます。
glenn mcdonald
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.