将字符串插入正则表达式


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

如果是这样,那么goo.include?(foo)就足够了!
格伦麦当劳

1
不,我不是想看看foo是否是goo的子字符串;我还需要进行一些捕获,因此收录行不通。
克里斯·邦奇

Answers:



125

需要注意的是,Regexp.quote乔恩L.的回答是很重要的!

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

如果您只是执行“显而易见的”版本:

if goo =~ /#{foo}/

那么匹配文本中的句"0.0.0.0"点将被视为regexp通配符,并将匹配"0a0b0c0"

还请注意,如果您确实只想检查子字符串是否匹配,则只需

if goo.include?(foo)

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


3
请注意,.quote()如果您要使用字符串构造正则表达式,则反向(不使用)也很有用。
杰西

“如果您真的只想检查子字符串是否匹配,则if goo.include?(foo)在有兴趣检查是否存在时,只需执行“ => True。如果您有兴趣替换并已经使用String.gsub,则Regexp.quote可能是您唯一的选择。
艾萨克·贝特什

只是要在Jesse上添加,以防万一,这意味着只需将不需要转义的字符串传递给Regexp.newor即可Regexp.compile
dylankb

感谢您对我们为什么可能要使用Regexp.quote有用的解释
Wylliam贾德

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”,因为点是正则表达式通配符。
格伦麦当劳
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.