使用正则表达式匹配存储在哈希中的内容

时间:2013-01-04 05:13:02

标签: ruby regex ruby-1.8.7

这是一个解释该问题的Ruby代码:

1.8.7 :018 > pattern[:key] = '554 5.7.1.*Service unavailable; Helo command .* blocked using'
 => "554 5.7.1.*Service unavailable; Helo command .* blocked using" 
1.8.7 :019 > line = '554 5.7.1 Service unavailable; Helo command [abc] blocked using dbl'
 => "554 5.7.1 Service unavailable; Helo command [abc] blocked using dbl" 
1.8.7 :020 > line =~ /554 5.7.1.*Service unavailable; Helo command .* blocked using/
 => 0 
1.8.7 :021 > line =~ /pattern[:key]/
 => nil 
1.8.7 :022 > 

正则表达式在直接用作字符串时起作用,但在我将其用作散列值时不起作用。

2 个答案:

答案 0 :(得分:2)

line =~ /#{pattern[:key]}/

...或

line =~  Regexp.new pattern[:key]

如果你想逃避正则表达式特殊字符......

line =~ /#{Regexp.quote pattern[:key]}/

修改:由于您不熟悉ruby,我建议您在定义pattern的地方执行此操作:

pattern[:key] = Regexp.new '554 5.7.1.*Service unavailable; Helo command .* blocked using'

然后,您可以简单地使用Regexp

中存储的pattern对象
line =~ pattern[:key]

答案 1 :(得分:2)

这本身不是一个Ruby问题,它是如何构建一个完成你想要的正则表达式模式。

在“正则表达式”中,/pattern[:key]/表示:

  1. 查找pattern
  2. pattern后找:key之一。
  3. Ruby不会像Perl那样自动插入字符串或正则表达式模式中的变量,因此,我们必须标记变量在内联使用#{...}的位置。

    如果您只使用/pattern[:key]/作为模式,请不要将其插入模式中。相反,采取直接路径让Regexp为您完成:

    pattern[:key] = 'foo'
    Regexp.new(pattern[:key])
    => /foo/
    

    结果如下:

    /#{pattern[:key]}/
    => /foo/
    

    但不会浪费CPU周期。

    您的另一次尝试使用了.[],它们是模式中的保留字符,用于帮助定义模式。如果你需要使用这些字符,你可以适当地使用Ruby的Regexp.escape添加\转义字符,在字符串中保留它们的正常/字面含义:

    Regexp.escape('5.7.1 [abc]')
    => "5\\.7\\.1\\ \\[abc\\]"
    

    ,在现实生活中是"5\.7\.1\ \[abc\]"(当没有在IRB中显示时)

    要在正则表达式中使用它,请使用:

    Regexp.new(Regexp.escape('5.7.1 [abc]'))
    => /5\.7\.1\ \[abc\]/