【发布时间】: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 的
[]允许固定字符串或正则表达式,gsub和sub也是如此。当类本身允许任何一个时,一个限制性的 API 似乎太死板了。 -
我使用的大多数正则表达式库都采用表示正则表达式的字符串,如果其中包含特殊字符,则您有责任手动或使用
escape方法对它们进行转义。如果您愿意,您可以随时修补自己的Regexp.string方法。