3

この正規表現を使用した入力とは別に、一致が 1 つしかないと予想していたのに、なぜ 2 つの一致が見つかったのかはわかりません。

preg_match(/_(\d(-\d){0,3})\./,$str,$matches);

このファイル文字列形式でname_A-B-C-D.ext.

次のような単一の一致が得られると予想されます。

Example A
[0] => name_A-B-C-D.ext  
[1] => A-B-C-D

Example B
[0] => name_A-B-C.ext  
[1] => A-B-C

しかし、これは私が得る結果です:

Example A
[0] => name_A-B-C-D.ext  
[1] => A-B-C-D
[2] => -D

Example B
[0] => name_A-B-C.ext  
[1] => A-B-C
[2] => -C

ハイフンが前に付いている場合に限り、キャプチャAしたいだけです。Dこのコードは使用可能で、2 番目の一致は無視できますが、その理由を知りたいです。2 つのキャプチャ グループに関係があるとしか思えません。私のエラーはどこですか?

4

3 に答える 3

8

はい、正規表現に 2 つのキャプチャ グループがあるため、2 つのキャプチャが得られます。

不要なキャプチャを回避するには、非キャプチャ グループを使用できます(?:...)

/_(\d(?:-\d){0,3})\./
于 2012-04-07T15:08:38.673 に答える
1

2 つのキャプチャ グループと関係があるとしか思えません。

あなたの仮定は正しいです

私のエラーはどこですか?

エラーはなく、すべてが期待どおりに動作しています。

于 2012-04-07T15:09:52.693 に答える
0

RE でグループ化する必要があるため、2 つの一致が得られます。驚くべきことは何ですか?括弧の各ペアはグループです。

于 2012-04-07T15:08:19.090 に答える