0

複数の論理和キャプチャ グループを持つ正規表現があります。

(a)|(b)|(c)|...

最初に正常に一致したキャプチャ グループのインデックスにアクセスするには、これよりも高速な方法はありますか?

(マッチャーは java.util.regex.Matcher のインスタンスです)

int getCaptureGroup(Matcher matcher){
    for(int i = 1; i <= matcher.groupCount(); ++i){
        if(matcher.group(i) != null){
            return i;
        }
    }
}
4

2 に答える 2

1

それはあなたがより速く何を意味するかによって異なります。start(int)代わりに使用することで、コードをもう少し効率的にすることができますgroup(int)

if(matcher.start(i) != -1){

グループの実際のコンテンツが必要ない場合は、それを保持するために新しい文字列オブジェクトを作成しようとしても意味がありません。パフォーマンスの違いに気付くとは思えませんが、このようにしない理由はありません

ただし、同じ量のボイラープレート コードを記述する必要があります。それを回避する方法はありません。Java の正規表現フレーバーは、他のほとんどの言語と比較して、シンタックス シュガーが大幅に不足しています。

于 2013-10-06T21:03:16.260 に答える
-1

私はパターンがそうだと思います:

if (matcher.find()) {
  String wholeMatch = matcher.group(0);
  String firstCaptureGroup = matcher.group(1);
  String secondCaptureGroup = matcher.group(2);
  //etc....
}

複数の一致が存在する可能性があります。そのため、すべてのマッチを通過するために while サイクルを使用できます。

java.util.regex.Patternの javadoc の「グループ番号」セクションをご覧ください。

于 2013-10-03T12:41:37.657 に答える