web-dev-qa-db-ja.com

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

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
144
Chris Bunch

文字列の挿入と同じです。

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

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

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

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

if goo =~ /#{foo}/

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

また、部分文字列の一致を本当に確認したい場合は、単に行うことができます

if goo.include?(foo)

追加の引用符や特殊文字を気にする必要はありません。

110
glenn mcdonald

おそらくRegexp.escape(foo)が出発点になりますが、より一般的な式補間を使用できない正当な理由があります:_"my stuff #{mysubstitutionvariable}"_?

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

6
JasonTrue
Regexp.compile(Regexp.escape(foo))
6
Markus Jarderot

Regexp.newを使用します。

if goo =~ Regexp.new(foo) # Evaluates to /0.0.0.0/
3
Jeremy Ruten

限定的だが有用な他の答えは次のとおりです。

入力文字列で単一引用符を使用した場合、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

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

2
Plasmarob