2013-06-17 13 views
6

私のRegExpには多数のキャプチャグループがありますが、キャプチャを行ったグループ(複数ある場合は最初または最後のグループ)を知りたいと思います。あなたがPythonをよく知っているなら、これは基本的にre.MatchObject.lastgroupに相当します。それをより明確にするためにいくつかのコード:RegExp検索で一致するグループを効率的に見つける

var re_captures = new RegExp("(\\d+)|(for)|(\\w+)", "g"); 
var str = " for me 20 boxes please"; 
var result; 

while ((result = re_captures.exec(str)) !== null) { 
    console.log(result[0], 'at', result.index, result.slice(1)); 
} 

それは出力します。

for at 1 [ undefined, 'for', undefined ] 
me at 5 [ undefined, undefined, 'me' ] 
20 at 8 [ '20', undefined, undefined ] 
boxes at 11 [ undefined, undefined, 'boxes' ] 
please at 17 [ undefined, undefined, 'please' ] 

をグループには、キャプチャを作ったが、私はすぐに与えられたそれぞれの試合のために見つける方法がわからなかった、グループresult配列ショー配列を反復することなく一致した。これは、大規模な正規表現がプログラムで構築され、反復処理が非効率的である場合に便利です。

明白なものがないか、それは可能ではありませんか?

+1

私はそれは可能ではないと思います。しかし、これが非効率になったとき、あなたは正確に何をしていますか?大規模な正規表現より大きな解決策があるかもしれません。 – Bergi

+0

@Bergi:私の使い方は、下のminitechの答えについた長いコメントを参照してください。 –

+0

私はこれが不正行為だと知っていますが、明示的な反復を避けるために 'indexOf'を使うことができます。確かに、エンジンは内部的に反復するでしょう – user123444555621

答えて

2

あなたは何も欠けていません。配列を反復することは唯一の方法です。

実際にパフォーマンスに問題があるのであれば、どのくらいのグループでマッチングを繰り返すことができますか?あなたがグループを必要としない場合、あなたはそれを非キャプチャにすることができますが、...

+0

答えをありがとう。 Reのパフォーマンス:私は数十のグループでかなり長い正規表現を作成するユースケースを持っています。コードのこの部分はパフォーマンスに影響を受けますので、1回のマッチごとに配列を反復処理する必要があります。本当に好奇心が強いのであれば、https://gist.github.com/eliben/5797351を見てください。これは正規表現ベースのレクサーであり、すべてを1つの巨大な正規表現に入れています。名前付きグループも使用しますが、これは必須ではありません。しかし、どのグループが*と一致しているかを知ることは*です。 –

+0

@EliBendersky:それぞれに対して異なる正規表現を作成し、それぞれが一致するかどうかを確認できます。私はそれがもっと速くなるとは思わない。私は通常、JavaScriptで「手作業」のものを解析しますが、それを一般化しようとするとうまくいかないのですか? = P – Ryan

+0

+1、私はおそらくここで複数の正規表現を使用していたでしょう。私はこれを(あなたのものではなく、OPのものではなく)最初の実行時にいくつかのカテゴリのすべてのトークンを収集し、その後、他のすべてを収集してさらに分割することができないのだろうか? – raina77ow

関連する問題