将字符串转换为正则表达式ruby


117

我需要将“ / [\ w \ s] + /”之类的字符串转换为正则表达式。

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

我尝试使用不同的Regexp方法,例如:

Regexp.new("/[\w\s]+/") => /\/[w ]+\//,类似Regexp.compileRegexp.escape。但是他们都没有得到我所期望的回报。

我还尝试了删除反斜杠:

Regexp.new("[\w\s]+") => /[w ]+/ 但是没有运气。

然后,我尝试使其变得简单:

str = "[\w\s]+"
=> "[w ]+"

它逃脱了。现在如何将字符串保持原样并将其转换为regexp对象?

Answers:


148

看起来这里您需要将初始字符串包含在单引号中(请参阅此页面

>> str = '[\w\s]+'
 => "[\\w\\s]+" 
>> Regexp.new str
 => /[\w\s]+/ 

137

要清楚

  /#{Regexp.quote(your_string_variable)}/

也在工作

编辑:将your_string_variable包装在Regexp.quote中,以确保正确性。


3
刚刚发现您无法以这种方式附加选项/#{your_regex}/#{options}
pduersteler 2014年

我想您是在谈论Rails吗?options是一个哈希,而Ruby则不是动态=)
Sergey Gerasimov 2014年

2
这并不能满足OP在Ruby 2.1上的要求,它会转换“ [\ w \ s] +” => / [w] + /
卡·史派勒

1
请注意,答案是在2012年给出的:)那时一切都很完美
Sergey Gerasimov

4
那是完美的一年。
Naftuli Kay

35

此方法将安全地转义具有特殊含义的所有字符:

/#{Regexp.quote(your_string)}/

例如,.将被转义,因为否则将其解释为“任何字符”。

记住要使用单引号的字符串,除非您希望插入常规字符串,否则反斜杠具有特殊含义。


2
不错,因为它说明了我们如何保护可能包含正则表达式+.中将解释的符号(例如)的字符串变量。
rchampourlier 2014年

1
这不符合OP在Ruby 2.1上的要求,它会转换“ [\ w \ s] +” => / [w \] \ + /
Luca Spiller 2015年

@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 2015年

1
@Luca Spiller,谢谢,应该在此处使用单引号,我将更新答案。
BitOfUniverse

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/}
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.