gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 17:55:42 27 4
gpt4 key购买 nike

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com