4

このページhttp://swtch.com/~rsc/regexp/regexp3.htmlでは、RE2 が名前付き式をサポートしていると書かれています。

RE2 は、Python スタイルの名前付き captures をサポートしていますが、.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

しかし、名前が一致するものにアクセスできないため、無駄な実装のようです。何か不足していますか?

4

1 に答える 1

4

コード出力を見ると、私が管理している Ruby re2 gemを使用しているようです。

最新リリース (0.2.0) の時点で、gemは基礎となるC++ re2 ライブラリの名前付きキャプチャ グループをサポートしていません。あなたが見ているエラーは、渡された非整数引数が単純に default に転送されるという事実によるものです。これは、irb セッションで次のように確認できます。MatchData#[]Array#[]

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"
于 2012-02-27T15:43:36.700 に答える