RE2正则表达式中如何使用命名捕获组?

4
在这个页面http://swtch.com/~rsc/regexp/regexp3.html上,它说RE2支持命名表达式。
RE2支持Python风格的命名捕获(?P<name>expr),但不支持.NET和Perl使用的替代语法(?<name>expr)(?'name'expr)
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

但我无法访问名称匹配的比赛,所以这似乎是一个无用的实现。我有什么遗漏的吗?


刚刚注意到你使用了RE2:我的回答不合适,已被删除。 - Chris McCauley
作为一个有趣的问题,你能说一下 RE2 能给你带来什么,而 Ruby 1.9.3 的 Regexp 实现却做不到吗? - sheldonh
也许所谓的命名引用是为了在替换字符串中使用它,或者在正则表达式中进行反向引用,就像这样:(?P=blah) - Jeremy Stein
1个回答

5

根据你的代码输出,似乎你正在使用我维护的 Ruby re2 gem

最新版本(0.2.0)的宝石不支持底层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>'

我将尽快添加按名称引用捕获的功能,并在发布后更新此答案。
更新:我刚刚发布了 版本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"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接