【发布时间】: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)