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

cmt*_*kur 111 ruby regex string ruby-1.9.3

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

"/[\w\s]+/" => /[\w\s]+/
Run Code Online (Sandbox Code Playgroud)

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

Regexp.new("/[\w\s]+/") => /\/[w ]+\//,同样Regexp.compileRegexp.escape.但是没有一个像我预期的那样回归.

我还尝试删除反斜杠:

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

然后我试着这么简单:

str = "[\w\s]+"
=> "[w ]+"
Run Code Online (Sandbox Code Playgroud)

它逃脱了.现在,字符串如何保持不变并转换为正则表达式对象?

alo*_*ony 141

在这里看起来你需要将单个引号中的初始字符串(参见本页)

>> str = '[\w\s]+'
 => "[\\w\\s]+" 
>> Regexp.new str
 => /[\w\s]+/ 
Run Code Online (Sandbox Code Playgroud)


Ser*_*mov 132

要清楚

  /#{Regexp.quote(your_string_variable)}/
Run Code Online (Sandbox Code Playgroud)

也在努力

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

  • 这是一个完美的一年. (4认同)
  • 刚刚发现你不能用_ /#{your_regex} /#{options}来附加选项. (3认同)
  • 这不是OP在Ruby 2.1上所要求的,它转换为"[\ w\s] +"=>/[w] + / (2认同)
  • 组合答案可以避免字符串插值: Regexp.new(Regexp.quote(your_string_variable)) (2认同)

san*_*rom 35

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

/#{Regexp.quote(your_string)}/
Run Code Online (Sandbox Code Playgroud)

例如,.将被转义,因为它被解释为"任何字符".

请记住使用单引号字符串,除非您希望使用常规字符串插值,其中反斜杠具有特殊含义.

  • 很好,因为它解释了我们如何保护可能包含将在Regexp中解释的符号(例如`+ .`)的字符串变量. (2认同)

Bit*_*rse 7

使用%表示法:

%r{\w+}m => /\w+/m
Run Code Online (Sandbox Code Playgroud)

要么

regex_string = '\W+'
%r[#{regex_string}]
Run Code Online (Sandbox Code Playgroud)

来自帮助:

%r [] Interpolated Regexp(标志可以在结束分隔符后出现)


rya*_*yan 5

宝石to_regexp可以完成这项工作。

"/[\w\s]+/".to_regexp => /[\w\s]+/
Run Code Online (Sandbox Code Playgroud)

您还可以使用修饰符:

'/foo/i'.to_regexp => /foo/i
Run Code Online (Sandbox Code Playgroud)

最后,您可以使用: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/}
Run Code Online (Sandbox Code Playgroud)