当用作文字正则表达式时,转义的Ruby正则表达式不提供匹配。为什么?

时间:2012-02-03 14:28:06

标签: ruby regex string escaping

代码说明了一切:

teststring = "helloworld$"
string_from_user = "world$"
regexp = Regexp.escape(string_from_user) # assigns "world\\$"
p teststring =~ Regexp.new(regexp) # prints 0 => match found
p teststring =~ /regexp/ # prints nil => no match

Regexp.escape文档中提到了第一个匹配的内容。 但为什么第二个版本不匹配?

我很担心,因为我需要将此正则表达式传递给第三方Ruby代码。字符串来自用户,所以我想逃避它。然后,在某些情况下,我可能会为此用户的字符串添加其他正则表达式符号。例如,我可能会传递"^helloworld\\$",以便第三方代码匹配"helloworld$othercontent"等字符串。

我担心如果第三方代码使用=~ /regexp/代替=~ Regexp.new(regexp),我就会遇到麻烦,因为上面的代码没有匹配。

1 个答案:

答案 0 :(得分:8)

因为/regexp/是与字符串"regexp"匹配的正则表达式。也许你的意思是/#{regexp}/

编辑:我从更充分地阅读您的问题开始,即将您的字符串传递给您知道将从该字符串制作正则表达式的第三方代码。在这种情况下,你应该是安全的。如上所述,/regexp/不可能是他们正在做的事情,因为它只是错误。他们必须使用Regexp.new()或类似的东西。