【问题标题】:Ruby regexp from variable来自变量的 Ruby 正则表达式
【发布时间】:2014-02-16 05:39:25
【问题描述】:

使用 Ruby 1.8.7 我想在数据库中存储一些正则表达式,并在需要使用它们进行验证时轻松地将它们重组为 Regexp 对象。我发现 Ruby 表现出一些不受欢迎的行为。例如:

r = Regexp.new(/^\w+$/i)        => /^\w+$/i
r_i = r.inspect                 => "/^\\w+$/i"
r_s = r.to_s                    => "(?i-mx:^\\w+$)"
r_from_r_i = Regexp.new(r_i)    => /\/^\w+$\/i/
r_from_r_s = Regexp.new(r_s)    => /(?i-mx:^\w+$)/
r == r_from_r_i                 => false
r == r_from_r_s                 => false

我想要的是能够以/pattern/options 的形式将Regexp 存储在数据库中,而不是(?options:pattern) 格式,因为我更熟悉前者。但是,当从一个变量创建一个新的Regexp 时,模式变得很古怪。 Ruby 正在转义 /s - 所以该模式无效。

有什么方法可以让 Ruby 在解析正则表达式时遵循 /pattern/options 格式?

【问题讨论】:

  • 真的,r_s 怎么了?它不会与原始版本进行比较,但其行为完全相同。
  • @JanDvorak 你是对的!
  • 我上面更新的示例突出显示了这里的真正问题。从字符串变量加载正则表达式时,当我只想让Regexp 对象按原样解析我的模式和字符串时,/s 会被转义。
  • 请不要改变问题,经过这么多小时,这让我现在的努力完全模糊了。请回滚您的编辑。创建一个新帖子,我们会在那里为您提供帮助。

标签: ruby regex ruby-1.8.7


【解决方案1】:

你可以这样做:

r = Regexp.new(/^\w+$/i) # => /^\w+$/i
source,option = r.source,r.options # => ["^\\w+$", 1]
regex = Regexp.new(source,option)
regex == r # => true

options

返回与创建此Regexp时使用的选项相对应的位集

source

返回模式的原始字符串

现在,如果您想要一个变量来保存所有 Regex 详细信息,请考虑如下:

r = Regexp.new(/^\w+$/i) # => /^\w+$/i
source_option = r.source,r.options # => ["^\\w+$", 1]
regex = Regexp.new(*source_option)
regex == r # => true

为什么你的得到falseto_sinspect

仔细阅读文档;你可以看到Regexp.to_s 在说:

返回一个包含正则表达式及其 options 的字符串(使用 (?opts:source) 表示法。这个字符串可以反馈到 Regexp::new到与原始语义相同的正则表达式。(但是,Regexp#== 在比较两者时可能不会返回 true,因为正则表达式本身的来源可能不同,如示例所示) .Regexp#inspect 产生一个通常更易读的 rxp 版本。

现在看:

r = Regexp.new(/^\w+$/i) # => /^\w+$/i
r_s = r.to_s
r_from_r_s = Regexp.new(r_s)
r == r_from_r_s # => false
# because the source strings are not same for r and r_from_r_s
r.source # => "^\\w+$"
r_from_r_s.source # => "(?i-mx:^\\w+$)"

r == r_from_r_i 的结果同上。

【讨论】:

  • 感谢您的回答,但我想我在发布原始问题时不清楚 - 已经是深夜了。问题在于从字符串加载正则表达式 - 请参阅我更新的问题,让我知道是否有任何方法可以让 Regexp 对象以/pattern/options 的形式解析我的完整正则表达式。谢谢!
  • @JoshM。经过这么多小时后,请不要更改问题,这使我现在的努力完全模糊。请回滚您的编辑。创建一个新帖子,我们会在那里为您提供帮助。
  • @JoshM。可能适合你。对我们来说,我们从您的示例中了解到的内容试图澄清这一点。所以,现在如果您认为,您需要更多帮助来解决您的问题,请创建另一个帖子,提出具体的疑问..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-28
  • 2011-01-17
  • 2016-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多