这是一个解释该问题的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 >
正则表达式在直接用作字符串时起作用,但在我将其用作散列值时不起作用。
答案 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]/
表示:
pattern
。pattern
后找:
,k
,e
或y
之一。 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\]/