另一种方法,而不是逃避正则表达式模式?

时间:2010-08-19 01:53:50

标签: ruby regex

通常当我的正则表达式模式如下:

http://www.microsoft.com/

然后我必须像这样逃避它:

string.match(/http:\/\/www\.microsoft\.com\//)

还有其他方式而不是像那样逃避吗?

我希望能够像http://www.microsoft.com一样使用它,因为我不想逃避所有模式中的所有特殊字符。

5 个答案:

答案 0 :(得分:63)

Regexp.new(Regexp.quote('http://www.microsoft.com/'))

Regexp.quote只是逃避任何具有特殊正则表达式含义的字符;它需要并返回一个字符串。请注意,.也很特殊。引用之后,您可以在传递给构造函数之前根据需要附加到regexp。一个简单的例子:

Regexp.new(Regexp.quote('http://www.microsoft.com/') + '(.*)')

这会为路径的其余部分添加一个捕获组。

答案 1 :(得分:9)

通过使用%r并在正则表达式之前定义一个字符,您还可以在Ruby中使用任意分隔符作为正则表达式,例如:

%r!http://www.microsoft.com/!

答案 2 :(得分:5)

Regexp.quoteRegexp.escape可用于为您自动转义:

http://ruby-doc.org/core/classes/Regexp.html#M001195

可以将结果传递给Regexp.new以创建Regexp对象,然后可以调用对象的.match方法并将其传递给匹配的字符串(与{{1}相反的顺序) })。

答案 3 :(得分:0)

您可以简单地使用单引号进行转义。

string.match('http://www.microsoft.com/')

如果您在文本中需要单引号,也可以使用%q{}。如果您需要在字符串中外推变量,请使用%Q{}。这相当于双引号"。 如果字符串包含您想要外推的正则表达式(例如:.*?()[]^$),请使用//或%r {}

答案 4 :(得分:-2)

为方便起见,我只需定义

def regexcape(s)
  Regexp.new(Regexp.escape(s))
end