代码之家  ›  专栏  ›  技术社区  ›  Andy

如何在Ruby中测试regexp并获取匹配的部分?

  •  0
  • Andy  · 技术社区  · 14 年前

    我有一个输入,可以有不同的结构。我想测试几个模式,并在每种情况下得到相应的匹配部分,而不重复正则表达式。例如:

    a = "hello123"
    case a
    when /^([0-9]+)([a-z]+)$/
      # how to get matching values?
    when /^([a-z]+)([0-9]+)$/
      # how to get matching values?
    else
    end
    

    这是一个非常简单的例子,我的代码有点复杂。

    2 回复  |  直到 14 年前
        1
  •  3
  •   Draco Ater    14 年前

    使用 $~

    a = "hello123"
    case a
    when /^([0-9]+)([a-z]+)$/
      print $~
    when /^([a-z]+)([0-9]+)$/
      print $~
    else
    end
    

    将打印 MatchData 对象(MatchData是特殊变量$~的类型,是Regexp\match和Regexp\last\u match返回的对象的类型。它封装了模式匹配的所有结果,这些结果通常通过特殊变量$&,$,$`$1, $2, ( more about special vars

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

        2
  •  2
  •   Gishu    14 年前
    a = "hello123"
    case a
    when /^([0-9]+)([a-z]+)$/
      # how to get matching values?
      puts [$~, $1, $2]
    when /^([a-z]+)([0-9]+)$/
      print "regex 2 matched "
      p [$1, $2]                    # => ["hello", "123"]
      p $~.to_a                     # => ["hello123", "hello", "123"]
    else
    end