将字符串插入正则表达式

时间:2008-09-29 18:48:34

标签: ruby regex

我需要将字符串的值替换为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

7 个答案:

答案 0 :(得分:248)

与字符串插入相同。

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

答案 1 :(得分:106)

请注意,Regexp.quote中的Jon L.'s answer非常重要!

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

如果您只是做“明显”的版本:

if goo =~ /#{foo}/

然后匹配文本中的句点被视为正则表达式通配符,"0.0.0.0"将与"0a0b0c0"匹配。

另请注意,如果您真的只想检查子字符串匹配,则只需执行

即可
if goo.include?(foo)

不需要额外引用或担心特殊字符。

答案 2 :(得分:6)

可能Regexp.escape(foo)可能是一个起点,但是有一个很好的理由你不能使用更传统的表达式插值:"my stuff #{mysubstitutionvariable}"

此外,您可以将!goo.match(foo).nil?与文字字符串一起使用。

答案 3 :(得分:6)

Regexp.compile(Regexp.escape(foo))

答案 4 :(得分:3)

使用Regexp.new:

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

答案 5 :(得分:2)

这是一个有限但有用的其他答案:

我发现如果我只在输入字符串上使用单引号,我可以轻松插入正则表达式而不使用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

当我需要多次使用相同长度的正则表达式时,这对我有所帮助。 不是普遍的,但我认为这符合问题的例子。

答案 6 :(得分:-2)

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

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