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

标签 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 > 

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

最佳答案

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

在“regex-ese”中,/pattern[:key]/ 表示:

  1. 找到模式
  2. 按照 pattern 查找 之一:key.

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/

相关文章:

php - 从维基百科模板获取参数

Ruby - 根据某些条件从数组中选择修改后的值

ruby - 使用 ruby​​mine 调试 Rails 应用程序

ruby - 如何在 proc 上下文中评估 "local_variables"?在 ruby

ruby-on-rails - 在回形针和 RMagick 中将现有图像调整为新样式

ruby - Rails 的人体高度下拉

ruby-on-rails - 在 ruby​​ hash 中使用常量作为键

javascript - 捕获字符之间的字符串并替换

regex - 使用 Perl 自动进行形态标记

ruby-on-rails - 引发异常时如何获取整个错误堆栈?