Ruby-提取正则表达式捕获组的最佳方法?

Ruby-提取正则表达式捕获组的最佳方法?,ruby,regex,Ruby,Regex,我在读一个问题,我发现有两种方法可以引用正则表达式中的捕获组,即 字符串方法,例如string.match(/(^.*)(:)(.*)/i)。捕获 从if match=~/(^.*)(:)(.*)/i 更新:正如0xCAFEBABE提到的,还有第三个选项-方法 哪个更好?对于1),为了安全起见,您必须使用if语句来防范nils,那么为什么不直接提取信息呢?而不是第二步调用string captures方法。因此,选项2)对我来说更方便。对于简单的任务,直接访问伪变量$1等可能会更简单,但当事情变

我在读一个问题,我发现有两种方法可以引用正则表达式中的捕获组,即

  • 字符串方法,例如
    string.match(/(^.*)(:)(.*)/i)。捕获
  • if match=~/(^.*)(:)(.*)/i
  • 更新:正如0xCAFEBABE提到的,还有第三个选项-方法

  • 哪个更好?对于1),为了安全起见,您必须使用if语句来防范nils,那么为什么不直接提取信息呢?而不是第二步调用string captures方法。因此,选项2)对我来说更方便。

    对于简单的任务,直接访问伪变量
    $1
    等可能会更简单,但当事情变得复杂时,通过
    匹配数据
    实例访问东西(几乎)是唯一的方法

    例如,假设您正在执行嵌套的
    gsub

    string1.gsub(regex1) do |string2|
      string2.gsub(regex2) do
        ... # Impossible/difficult to refer to match data of outer loop
      end
    end
    
    在内部循环中,假设您希望引用外部
    gsub
    的捕获组。调用
    $1
    $2
    等将不会给出正确的结果,因为通过执行内部
    gsub
    循环,最后一个匹配数据已更改。这将是一个错误的来源

    有必要通过匹配数据引用捕获的组:

    string1.gsub(regex1) do |string2|
      m1 = $~
      string2.gsub(regex2) do
        m2 = $~
        ... # match data of the outer loop can be accessed via `m1`.
            # match data of the inner loop can be accessed via `m2`.
      end
    end
    

    简言之,如果您想为简单的任务做一些简短的黑客行为,可以使用伪变量。如果你想让你的代码更加结构化和可扩展,你应该通过匹配数据来访问数据。

    自v2.4.6以来,Ruby已经有了名为的捕获,可以这样使用。只需在捕获组中添加
    语法即可

    /(\w)(\w)/.match(“ab”).捕获#=>[“a”,“b”]
    /(\w)(\w)/.match(“ab”).named_捕获#=>{}
    /(?\w)(\w)/.match(“ab”).捕获#=>[“a”]
    /(?\w)(\w)/.match(“ab”).named#u捕获#=>{“some_name”=>“a”}
    
    更重要的是,您可以通过名称引用命名捕获

    result=/(?\w)(\w)/.match(“ab”)
    结果[“某个名称”]#=>“a”
    
    甚至还有第三个:。哦,好吧,timtowtdi。没有
    匹配
    类。你可能是说
    MatchData
    class.@sawa我的错,这是一个字符串方法,我已经更新了这个问题。对于现代Ruby,大约2020年,这是正确的答案。