评估存储在数据库中的Ruby正则表达式

时间:2014-06-23 17:24:45

标签: ruby-on-rails ruby regex

我正在构建一个工具来将各种内容的重写规则保存到数据库表中:

+--------------+--------------+------+-----+---------+----------------+
| Field        | Type         | Null | Key | Default | Extra          |
+--------------+--------------+------+-----+---------+----------------+
| id           | int(11)      | NO   | PRI | NULL    | auto_increment |
| replace_text | varchar(100) | NO   |     | NULL    |                |
| replace_with | varchar(100) | YES  |     | NULL    |                |
| scp          | varchar(20)  | YES  |     | NULL    |                |
+--------------+--------------+------+-----+---------+----------------+

当我处理内容时,我只需提取所有相关规则(基于scp字段)并运行<variable>.gsub(replace_text, replace_with)来更改所需内容。

我的问题是,是否可以检查replace_text是否包含有效的正则表达式并使用它而不是替换列的纯文本内容?

因为基本上:

 "Sometimes it's best to keep things simple".gsub('/[aeiou]/',"x")

输出&#34;有时最好保持简单&#34;

while:

"Sometimes it's best to keep things simple".gsub(eval('/simple/'),"x")

"Sometimes it's best to keep things simple".gsub(/simple/,"x")

输出我需要的东西:

&#34;有时最好保留x&#34;

所以基本上我正在寻找的方法是找出字符串是否包含有效的正则表达式。

我已经四处搜索了,似乎正常的表达式无法通过其他正则表达式进行验证。始终使用eval()不是一个选项,因为变量可能并不总是包含正则表达式,而只是一些要删除/替换的纯文本。

TIA

4 个答案:

答案 0 :(得分:3)

给定包含有效正则表达式的字符串,Regexp.new成功返回:

Re1.9.3-p484 :001 > Regexp.new("asdf")
 => /asdf/ 

给定包含无效正则表达式的字符串,Regexp.new引发RegexpError:

1.9.3-p484 :002 > Regexp.new("asdf)")
RegexpError: unmatched close parenthesis: /asdf)/

因此:

def pattern_to_regexp(pattern)
  Regexp.new(pattern)
rescue RegexpError
  nil
end
alias valid_regexp_pattern? pattern_to_regexp
如果可能,

返回Regexp,如果模式字符串不是有效的正则表达式,则返回nil。

由于Regexp是真实的,而nil是假的,valid_regexp_pattern是相同的方法。

使用它:

s.gsub(pattern_to_regexp(pattern) || pattern, replacement)

这是因为String#gsub将Regexp或String作为搜索参数。

答案 1 :(得分:1)

  

所以基本上我正在寻找的是找出一个字符串的方法   是否包含有效的正则表达式。

试试这个:

str = "Sometimes it's best to keep things simple"
if str =~ /simple/
 #do your thing
end

您也可以尝试匹配:

do_something if str.match('simple')

答案 2 :(得分:1)

您可以使用Regexp类根据文本中的商店模式生成正则表达式。

record = Record.last
record.replace_test.gsub Regexp.new(record.replace_with), 'x'

答案 3 :(得分:0)

除了比利的回答,您还可以使用以下

record.replace_test.gsub /#{record.replace_with}/, 'x'