在这个页面上,它说re2支持命名表达式。
re2支持名为captures(?P<name>expr)的python样式,但不支持
.net和
Perl

ruby-1.9.2-p180 :003 > r = RE2::Regexp.compile("(?P<foo>.+) bla")
#=> #<RE2::Regexp /(?P<foo>.+) bla/>

ruby-1.9.2-p180 :006 > r = r.match("lalal bla")
#=> #<RE2::MatchData "lalal bla" 1:"lalal">

ruby-1.9.2-p180 :009 > r[1]   #=> "lalal"

ruby-1.9.2-p180 :010 > r[:foo]
TypeError: can't convert Symbol into Integer

ruby-1.9.2-p180 :011 > r["foo"]
TypeError: can't convert String into Integer

但我无法访问与名称匹配的内容,因此它看起来是一个无用的实现。我遗漏了什么吗?

最佳答案

看看您的代码输出,您似乎正在使用我维护的rubyre2 gem
从最新版本(0.2.0)开始,gem不支持底层的C++ re2 library's named capturing groups。您看到的错误是因为传递给MatchData#[]的任何非整数参数都将被转发到默认值Array#[]。您可以在IRB会话中这样确认:

irb(main):001:0> a = [1, 2, 3]
=> [1, 2, 3]
irb(main):002:0> a["bob"]
TypeError: can't convert String into Integer
    from (irb):2:in `[]'
    from (irb):2
    from /Users/mudge/.rbenv/versions/1.9.2-p290/bin/irb:12:in `<main>'
irb(main):003:0> a[:bob]
TypeError: can't convert Symbol into Integer
    from (irb):3:in `[]'
    from (irb):3
    from /Users/mudge/.rbenv/versions/1.9.2-p290/bin/irb:12:in `<main>'

我将努力增加能力,以引用捕获的名字尽快和更新这个答案一旦发布。
更新:我刚刚发布了version 0.3.0,现在支持如下命名组:
irb(main):001:0> r = RE2::Regexp.compile("(?P<foo>.+) bla")
=> #<RE2::Regexp /(?P<foo>.+) bla/>
irb(main):002:0> r = r.match("lalal bla")
=> #<RE2::MatchData "lalal bla" 1:"lalal">
irb(main):003:0> r[1]
=> "lalal"
irb(main):004:0> r[:foo]
=> "lalal"
irb(main):005:0> r["foo"]
=> "lalal"

10-05 20:32