2011-07-13 7 views
3

このページでhttp://swtch.com/~rsc/regexp/regexp3.html RE2は名前付き式をサポートしています。 RE2正規表現では名前付きキャプチャグループはどのように使用されていますか?

RE2

はキャプチャ (?P<name>expr)という名前のPythonのスタイルをサポートしますが、ない 代替は (?<name>expr)(?'name'expr)は.NETと の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 

しかし、私は名前の一致にアクセスすることはできないんだけど、それは無用の実装のように思えます。何か不足していますか?

+0

はちょうどRE2の使用を発見:私の答えは適切ではなかったため、削除されました。 –

+0

興味深いことに、RE2があなたにルビ1.9.3のRegexp実装がないと言うことができますか? – sheldonh

+0

おそらく、名前付き参照は置換文字列で使うことができるので、次のように正規表現で逆参照することができます: '(?P = blah)' –

答えて

3

あなたのコード出力を見ると、あなたが維持している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>' 

を私はリリースが行われた後、できるだけ早く名前でキャプチャを参照する機能を追加し、この答えを更新するよう努めます。

アップデート:私はちょうど今、そうのような名前のグループをサポートする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" 
関連する問題