106

私が書いていない次のJava正規表現があり、変更しようとしています:

^class-map(?:(\\s+match-all)|(\\s+match-any))?(\\s+[\\x21-\\x7e]{1,40})$
           ^                                 ^

これに似ています

最初の疑問符に注意してください。グループはオプションであるということですか?対応する の後にすでに疑問符があり)ます。コロンは正規表現で特別な意味を持っていますか?

正規表現は正常にコンパイルされ、それがどのように機能するかを示す JUnit テストが既に存在します。最初のクエスチョン マークとコロンがなぜそこにあるのか、少し混乱しているだけです。

4

2 に答える 2

156

(?:非キャプチャ グループを開始します。(使用後に正規表現からグループを取得しない限り、それは同じです。非キャプチャ グループとはを参照してください。疑問符の後にコロン (?:) が続くとはどういう意味ですか? .

于 2012-07-17T21:06:22.370 に答える
50

このスレッドに少し遅れました-ryanpの答えに基づいて構築するだけです。

文字列があると仮定しますaaabbbccc

正規表現

(a)+(b)+(c)+

これにより、一致した次の 3 つのグループが得られます。

['a', 'b', 'c']

非キャプチャ括弧を使用した正規表現

?:最初のグループでを使用する

(?:a)+(b)+(c)+

一致した次のグループを取得します。

['b', 'c']

したがって、「非キャプチャ括弧」と呼ばれる理由

使用例:

他の目的で括弧を使用することがあります。たとえば、|or 演算子の境界を設定するには、次のようにします。

"New (York|Jersey)"

この場合、または|スイッチに括弧のみを使用しており、実際にはこのデータをキャプチャする必要はありません。非キャプチャ括弧を使用して、次のことを示します。

"New (?:York|Jersey)"
于 2015-04-29T02:51:48.677 に答える