【问题标题】:How are named capture groups used in RE2 regexps?RE2 正则表达式中如何使用命名捕获组?
【发布时间】:2011-10-04 15:43:15
【问题描述】:

在此页面http://swtch.com/~rsc/regexp/regexp3.html 上,它说 RE2 支持命名表达式。

RE2 支持 Python 风格的命名捕获 (?P<name>expr),但不支持 .NET 使用的替代语法 (?<name>expr)(?'name'expr) 和 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

但我无法通过名称访问匹配项,因此这似乎是一个无用的实现。我错过了什么吗?

【问题讨论】:

  • 刚刚发现您对 RE2 的使用:我的回答不恰当,已被删除。
  • 作为一个有趣的问题,你能说一下 RE2 为你提供了什么,而 ruby​​ 1.9.3 的 Regexp 实现没有?
  • 也许命名引用是为了让您可以在替换字符串中使用它,或者在正则表达式中反向引用它,如下所示:(?P=blah)

标签: ruby regex re2


【解决方案1】:

查看您的代码输出,您似乎正在使用我维护的 Ruby re2 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"

【讨论】:

    猜你喜欢
    • 2019-03-17
    • 2011-03-03
    • 1970-01-01
    • 2014-10-27
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 2019-05-19
    • 1970-01-01
    相关资源
    最近更新 更多