2012-04-07 5 views
3

なぜこの正規表現を使用して入力とは別に2つの一致が見つかったのか分かりません。この正規表現のキャプチャで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 

をしかし、これは私が得る結果である:私はそので始まる場合DまでAをキャプチャしたい

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 

ハイフン。 このコードは使用可能で、2番目の試合を無視することはできますが、その理由を知りたいと思います。私はそれが私の2つのキャプチャグループと何か関係があると仮定することしかできません。私のエラーはどこですか?

答えて

8

はい、正規表現に2つのキャプチャグループがあるので、2つのキャプチャを取得します。あなたは非キャプチャグループ(?:...)使用することができ、不要なキャプチャ避けるため

/_(\d(?:-\d){0,3})\./ 
0

REにグループを追加する必要がありますので、2つのマッチがあります。驚くべきことは何ですか? 括弧の各ペアはグループです。

+0

グループを非キャプティブにする方法を理解するのに役立ちます。 – Kim

1

を私はそれは私の2つのキャプチャグループとは何かを持っていると仮定することができます。

あなたの仮定が正しい

私の誤差がある?ありますか

エラーはありません。すべてが正常に動作しています。

関連する問題