【问题标题】:Another way instead of escaping regex patterns?另一种方法而不是转义正则表达式模式?
【发布时间】:2010-08-19 01:53:50
【问题描述】:

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

http://www.microsoft.com/

那我得像这样逃避它:

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

有没有其他方法可以代替这样逃避它?

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

【问题讨论】:

    标签: ruby regex


    【解决方案1】:
    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/')}/)
    • 用四位数年份捕获组替换所有“CURRENT_YEAR”令牌:Regexp.new( input_string.split("CURRENT_YEAR").map { |p| Regexp.quote(p) }.join("(\\d{4})") )
    • 鉴于此,这不应该返回成功吗?如果 Regexp.new(Regexp.quote('.')).match('A')
    【解决方案2】:

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

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

    【讨论】:

    • 虽然这有助于避免转义 / 字符,但对于圆括号、方括号和其他特殊字符之类的内容却无济于事。
    【解决方案3】:

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

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

    可以将结果传递给Regexp.new 以创建Regexp 对象,然后您可以调用该对象的.match 方法并将匹配的字符串传递给它(与string.match(/regex/) 的顺序相反)。

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        【解决方案5】:

        为了方便我只定义

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-01-18
          • 1970-01-01
          • 2011-12-21
          • 1970-01-01
          • 2018-10-26
          • 1970-01-01
          • 2012-02-28
          相关资源
          最近更新 更多