1

这是解释该问题的 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 > 

正则表达式在直接用作字符串时有效,但在我将其用作哈希值时无效。

4

2 回答 2

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]
于 2013-01-04T05:15:03.787 回答
2

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

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

  1. 找到pattern
  2. 接下来pattern寻找:、或k中的一个。ey

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\]/
于 2013-01-04T05:33:18.360 回答