2016-04-20 66 views
0

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

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))之外,还有更好的方法将字符串转换为正则表达式吗?毕竟,这个红宝石。

+5

'Regexp.new'不应该这样工作,因为不能使用“特殊的”正则表达式然后。另外,我认为'包括'也会做同样的工作。检查[*如何检查一个字符串是否包含Ruby中的子字符串?](http://stackoverflow.com/questions/8258517/how-to-check-whether-a-string-contains-a-substring-in- ruby) –

+1

'String :: include?'是匹配'String'与另一个'String'的最佳方式,但我不认为它可以输出'Regexp'。不过,我购买了关于'Regexp.new'的观点。 –

+1

问题是,你根本不需要一个'Regexp'来检查字符串是否存在于另一个'String'里面。这是多余的复杂/开销。 –

回答

2

你不应该需要运行Regexp.new(Regexp.escape(string))这是因为,在核心和STDLIB,实际上是需要一个正则表达式还需要一个字符串(如它应该)每一个方法。

在原始情况下,如果您尝试使用特殊字符(如"foo(bar)")与古怪的字符串匹配大字符串big_string,则可以运行big_string.match("foo(bar)")

如果你试图做一些票友,你可能需要直接组成同时使用::escape::new,但绝不。例如,如果我们想匹配big_string上的一个古怪的字符串后跟一个数字,我们将运行Regexp.new(Regexp.escape(string) + "\\d")

+0

在这里小心。 '“\ d”'是字符串中的* literal *'d',但'/ \ d /'是正则表达式上下文中的数字。在这种情况下你需要''\\ d“'。 – tadman

+0

是的,这就是我发布之前未测试代码的原因。 –

+0

我不认为这是正确的。 “(foo(bar)”))=># nil',但是“foo(bar)”。 “富(巴)”>' –

相关问题