【问题标题】:Convert String to Regexp in Ruby在 Ruby 中将字符串转换为正则表达式
【发布时间】:2016-08-13 21:36:25
【问题描述】:

我经常需要将字符串转换为正则表达式。对于许多字符串,Regexp.new(string) 就足够了。但如果string 包含特殊字符,则需要对其进行转义:

string = "foo(bar)"
regex = Regexp.new(string) # => /foo(bar)/
!!regex.match(string) # => false

Regexp 类有一个很好的方法来转义所有正则表达式的特殊字符:Regexp.escape。它是这样使用的:

string = "foo(bar)"
escaped_string = Regexp.escape(string) # => "foo\\(bar\\)"
regex = Regexp.new(escaped_string) # => /foo\(bar\)/ 
!!regex.match(string) # => true

这看起来应该是Regexp.new 工作的默认方式。除了Regexp.new(Regexp.escape(string)),还有更好的方法将字符串转换为正则表达式吗?毕竟,这 Ruby。

【问题讨论】:

  • Regexp.new 不应该那样工作,因为那时不能使用“特殊”正则表达式结构。另外,我认为include 会做同样的工作。检查How to check whether a string contains a substring in Ruby?
  • String::include? 是将String 与另一个String 匹配的最佳方式,但我认为它不能输出Regexp。不过,我相信你关于 Regexp.new 的观点。
  • 重点是,您根本不需要Regexp 来检查文字String 是否存在于另一个String 中。那是多余的并发症/开销。
  • String 的 [] 允许固定字符串或正则表达式,gsubsub 也是如此。当类本身允许任何一个时,一个限制性的 API 似乎太死板了。
  • 我使用的大多数正则表达式库都采用表示正则表达式的字符串,如果其中包含特殊字符,则您有责任手动或使用escape 方法对它们进行转义。如果您愿意,您可以随时修补自己的 Regexp.string 方法。

标签: ruby regex string


【解决方案1】:

您永远不需要运行Regexp.new(Regexp.escape(string)) 这是因为,在 Core 和 StdLib 中,几乎每个采用正则表达式的方法也采用字符串(应该如此)。

在最初的情况下,如果您尝试在带有特殊字符(如 "foo(bar)")的古怪字符串上匹配大字符串 big_string,则只需运行 big_string.match("foo(bar)")

如果您想做一些更高级的事情,您可能需要同时使用::escape::new,但从不直接合成。例如,如果我们想在一个古怪的字符串上匹配big_string,后跟一个单独的数字,我们将运行Regexp.new(Regexp.escape(string) + "\\d")

【讨论】:

  • 这里要小心。 "\d" 是字符串中的 literal d,但 /\d/ 是正则表达式上下文中的数字。在这种情况下,您需要 "\\d"
  • 是的,这就是我在发布之前没有测试代码的结果。
  • 我不认为这是正确的。 "foo(bar)".match("foo(bar)") => nil,但"foo(bar)".match(Regexp.escape("foo(bar)")) => #<MatchData "foo(bar)">
猜你喜欢
  • 2012-01-28
  • 1970-01-01
  • 2011-10-03
  • 2021-10-02
  • 2022-11-18
  • 2013-06-09
  • 2015-09-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多