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

139
我需要将类似于"/[\w\s]+/"的字符串转换成正则表达式。
"/[\w\s]+/" => /[\w\s]+/

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

Regexp.new("/[\w\s]+/") => /\/[w ]+\//,同样也有Regexp.compileRegexp.escape。但是它们都没有按照我的期望返回结果。

我还尝试去掉反斜杠:

Regexp.new("[\w\s]+") => /[w ]+/ 但是依然没有成功。

然后我试图简化这个问题:

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

它需要转义。现在该怎么样让字符串保持不变并转换为正则表达式对象?

6个回答

180

看起来你需要将初始字符串放在单引号中(参见此页面)。

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

或者你可以使用两个反斜杠"[\w\s]+" - frostymarvelous

151

明确一点:

  /#{Regexp.quote(your_string_variable)}/

也能正常工作。

编辑:为了准确性,将你的字符串变量用Regexp.quote包装起来。


6
刚刚发现你不能这样附加选项,例如 /#{your_regex}/#{options}。请注意不要改变原意,使翻译更加通俗易懂,但不要添加任何额外信息。 - pdu
我猜你在谈论Rails吧?options是一个哈希表,而Ruby并不是那么动态 =) - Sergey Gerasimov
2
这段代码在 Ruby 2.1 上并不能实现 OP 所要求的功能,它只是将 "[\w\s]+" 转换为 /[w ]+/。 - Luca Spiller
1
请注意,答案是在2012年给出的 :) 当时一切都很完美。 - Sergey Gerasimov
7
这是一个完美的一年。 - Naftuli Kay
2
将答案组合起来可以避免字符串插值:Regexp.new(Regexp.quote(your_string_variable)) - Ekkstein

38

这个方法将安全地转义所有具有特殊意义的字符:

/#{Regexp.quote(your_string)}/
例如, . 将被转义,因为它被解释为“任何字符”。 请记得使用单引号字符串,除非您想要启用常规字符串插值,其中反斜杠具有特殊含义。

2
很好,因为它解释了如何保护字符串变量,该变量可能包含在Regexp中被解释的符号(例如+.)。 - Romain Champourlier
1
这段代码在 Ruby 2.1 上并不能实现 OP 所要求的功能,它将 "[\w\s]+" 转换为 /[w\ ]+/。 - Luca Spiller
@LucaSpiller 你需要使用单引号字符串,因为在双引号字符串中,反斜杠被视为特殊字符,这就是为什么例如 "\n" 是换行符但 '\n' 不是的原因。 - sandstrom

10
使用%符号表示:
%r{\w+}m => /\w+/m

或者

regex_string = '\W+'
%r[#{regex_string}]

来自帮助

%r[ ] 插值正则表达式(标识可以出现在关闭分隔符之后)


这段代码在 Ruby 2.1 上并不能实现 OP 所要求的功能,它只是将 "[\w\s]+" 转换为 /[ws]+/。 - Luca Spiller
1
@Luca Spiller,谢谢,应该使用单引号,我会更新答案。 - BitOfUniverse

6

宝石 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/}

1

我刚遇到了这个问题,我需要在一个转译器中将字符串'/[\w\s]+/'转换为正则表达式。我使用了eval函数:

irb(main):001:0> eval( '/[\w\s]+/' )
=> /[\w\s]+/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接