我需要将“/ [\ w \ s] + /”之类的字符串转换为正则表达式。
"/[\w\s]+/" => /[\w\s]+/
我尝试使用不同的Regexp
方法,例如:
Regexp.new("/[\w\s]+/") => /\/[w ]+\//
,类似Regexp.compile
和Regexp.escape
。但是没有一个像我预期的那样回归。
我还尝试删除反斜杠:
Regexp.new("[\w\s]+") => /[w ]+/
但没有运气。
然后我试着这么简单:
str = "[\w\s]+"
=> "[w ]+"
它逃脱了。现在,字符串如何保持不变并转换为正则表达式对象?
答案 0 :(得分:132)
在这里看起来你需要将单个引号中的初始字符串(参考this page)
>> str = '[\w\s]+'
=> "[\\w\\s]+"
>> Regexp.new str
=> /[\w\s]+/
答案 1 :(得分:126)
要清楚
/#{Regexp.quote(your_string_variable)}/
也在努力
编辑在Regexp.quote中包装了your_string_variable,以确保正确无误。
答案 2 :(得分:34)
此方法将安全地转义具有特殊含义的所有字符:
/#{Regexp.quote(your_string)}/
例如,.
将被转义,因为它被解释为“任何字符”。
请记住使用单引号字符串,除非您希望使用常规字符串插值,其中反斜杠具有特殊含义。
答案 3 :(得分:6)
使用%表示法:
%r{\w+}m => /\w+/m
或
regex_string = '\W+'
%r[#{regex_string}]
来自help:
%r []插值正则表达式(结束后会出现标记) 定界符)
答案 4 :(得分:4)
宝石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/}