【发布时间】:2010-08-19 01:53:50
【问题描述】:
通常当我的正则表达式模式如下所示:
http://www.microsoft.com/
那我得像这样逃避它:
string.match(/http:\/\/www\.microsoft\.com\//)
有没有其他方法可以代替这样逃避它?
我希望能够像 http://www.microsoft.com 这样使用它,因为我不想转义所有模式中的所有特殊字符。
【问题讨论】:
通常当我的正则表达式模式如下所示:
http://www.microsoft.com/
那我得像这样逃避它:
string.match(/http:\/\/www\.microsoft\.com\//)
有没有其他方法可以代替这样逃避它?
我希望能够像 http://www.microsoft.com 这样使用它,因为我不想转义所有模式中的所有特殊字符。
【问题讨论】:
Regexp.new(Regexp.quote('http://www.microsoft.com/'))
Regexp.quote 只是转义任何具有特殊正则表达式含义的字符;它接受并返回一个字符串。请注意,. 也很特殊。引用后,您可以根据需要附加到正则表达式,然后再传递给构造函数。一个简单的例子:
Regexp.new(Regexp.quote('http://www.microsoft.com/') + '(.*)')
这会为路径的其余部分添加一个捕获组。
【讨论】:
string.match(/#{Regexp.quote('http://www.microsoft.com/')}/)
Regexp.new( input_string.split("CURRENT_YEAR").map { |p| Regexp.quote(p) }.join("(\\d{4})") )
您还可以在 Ruby 中为正则表达式使用任意分隔符,方法是使用 %r 并在正则表达式之前定义一个字符,例如:
%r!http://www.microsoft.com/!
【讨论】:
/ 字符,但对于圆括号、方括号和其他特殊字符之类的内容却无济于事。
Regexp.quote 或 Regexp.escape 可用于自动为您转义:
http://ruby-doc.org/core/classes/Regexp.html#M001195
可以将结果传递给Regexp.new 以创建Regexp 对象,然后您可以调用该对象的.match 方法并将匹配的字符串传递给它(与string.match(/regex/) 的顺序相反)。
【讨论】:
您可以简单地使用单引号进行转义。
string.match('http://www.microsoft.com/')
如果文本本身需要单引号,也可以使用%q{}。如果您需要在字符串中外推变量,请使用%Q{}。这相当于双引号"。
如果字符串包含您想要推断的正则表达式(例如:.*?()[]^$),请使用 // 或 %r{}
【讨论】:
为了方便我只定义
def regexcape(s)
Regexp.new(Regexp.escape(s))
end
【讨论】: