2011-12-28 79 views
91

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

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

我试图使用像不同Regexp方法:

Regexp.new("/[\w\s]+/") => /\/[w ]+\//,类似地Regexp.compileRegexp.escape。但他们没有一个像我预期的那样回报。

进一步我试图消除反斜线:

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

然后我试图做到这一点很简单:

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

它逃脱。现在字符串如何保持原样并转换为正则表达式对象?

回答

111

看起来在这里你需要的初始字符串是用单引号(参考this page

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

要清楚

/#{Regexp.quote(your_string_variable)}/ 

是工作压力太大

编辑:包裹为了正确性,使用Regexp.quote中的your_string_variable。

+2

刚刚发现,你_can't_追加这样的选项,比如'/#{your_regex} /#{options}'。 – pduersteler

+0

我想你说的是Rails? 'options'是一个哈希,而Ruby不是那么动态=) –

+0

啊,是的。我试着通过它“ix”:) – pduersteler

33

此方法将安全逃离的所有字符的特殊含义:

/#{Regexp.quote(your_string)}/ 

例如,.将被转义,因为它以其他方式解释为“任何字符”。

请记住使用一个单引号的字符串,除非您想要经常插入字符串,其中反斜杠有特殊含义。

+2

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

+1

这并不是OP在Ruby 2.1上所要求的,它会转换“[\ w \ s] +”=>/\ [w \\] \ +/ –

+0

@LucaSpiller您需要使用单引号字符串,反斜杠被视为双引号字符串中的特殊字符,这就是为什么例如'“\ n”'是换行符,但'\ n''不是。 – sandstrom

5

使用%表示法:

%r{\w+}m => /\w+/m 

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

help

%R []内插的正则表达式(标志可以关闭 分隔符之后出现)

+0

这不是OP在Ruby 2.1上所要求的,它会转换“[\ w \ s] +”=>/[ws] +/ –

+0

@Luca Spiller,谢谢,单引号应该用在那里,我会更新答案。 – BitOfUniverse

2

该宝石to_regexp可以做的工作。

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

您还可以使用修改器:

'/foo/i'.to_regexp => /foo/i 

最后,你可以更懒使用:检测

'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/} 
相关问题