如何通过Rails控制器存储Ruby正则表达式?

时间:2011-02-24 19:15:00

标签: ruby-on-rails ruby regex

对于Rails应用程序中的管理功能,我希望能够在数据库中存储正则表达式(作为字符串),并通过标准控制器操作添加它们。

我遇到了两个问题:

1)Rails参数过滤器似乎是自动转义反斜杠(转义字符),这会混淆正则表达式。例如:

\s{1,2}(foo)

变为:

\\s{1,2}(foo)

2)然后我尝试将write_attribute用于带有单个反斜杠的双反斜杠的gsub实例(基本上是对它们进行转义)。事实证明这比预期的要复杂得多。 (如果重要的话,我正在使用Ruby 1.9.2)。我发现的一些事情:

"hello\\world".gsub(/\\/, ' ') #=> "hello world"
"hello\\world".gsub(/\\/, "\\") #=> "hello\\world"
"hello\\world".gsub(/\\/, '\\') #=> "hello\\world"

我要做的是:

"hello\\world".gsub(/\\/, something) #=> "hello\world"

我很想知道这两种解决方案。

1)如何安全地将正则表达式作为参数传递并存储到Rails控制器操作中?

2)如何用一个反斜杠替换双反斜杠?

1 个答案:

答案 0 :(得分:3)

简而言之,您不能用字符串中的单个反斜杠替换双反斜杠,因为字符串中的单个反斜杠是转义字符。你能做的是以下几点:

Regexp.new("hello\\world") #=> /hello\world/

这会将您的字符串转换为正则表达式。这意味着:将正则表达式存储为字符串(使用转义字符),并在要与它们进行比较时将它们转换为正则表达式:

regexp = "\\s{1,2}(foo)"
reg = Regexp.new(regexp) #=> /\s{1,2}(foo)/
" foo" =~ reg #=> 0