在这个页面http://swtch.com/~rsc/regexp/regexp3.html上它说RE2支持命名表达式。
RE2 支持 Python 风格的命名捕获,但不支持 .NET和Perl 使用的
(?P<name>expr)替代语法。(?<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
Run Code Online (Sandbox Code Playgroud)
但我无法访问与名称的匹配,因此这似乎是一个无用的实现。我错过了什么吗?
查看您的代码输出,您似乎正在使用我维护的Ruby re2 gem 。
从最新版本 (0.2.0) 开始,gem不支持底层C++ re2 库的命名捕获组。您看到的错误是由于传递给的任何非整数参数都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>'
Run Code Online (Sandbox Code Playgroud)
我将努力尽快添加按名称引用捕获的功能,并在发布后更新此答案。
更新:我刚刚发布了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"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4079 次 |
| 最近记录: |