这是解释问题的 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 >
正则表达式在直接用作字符串时有效,但在我将其用作散列值时无效。
最佳答案
这本身不是一个 Ruby 问题,而是如何构建一个正则表达式模式来完成您想要的。
在“regex-ese”中,/pattern[:key]/
表示:
- 找到
模式
。 - 按照
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\]/
关于ruby - 使用正则表达式匹配存储在哈希中的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14151417/