2012-04-07 9 views
3

Ich weiß nicht, warum es 2 Übereinstimmungen abgesehen von der Eingabe mit dieser Regex gibt, wenn ich nur 1 Übereinstimmung erwartet.Warum erzeugt diese Regex-Aufnahme 2 Treffer?

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

in diesem Dateistringformat name_A-B-C-D.ext.

Ich würde erwarten, ein einziges Spiel wie folgt zu erhalten:

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 

Aber dies ist das Ergebnis, das ich bekomme:

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 

Ich wünsche nur A bis zu D erfassen, wenn sie mit ihrer voran ein Bindestrich. Dieser Code ist verwendbar und ich kann das 2. Match einfach ignorieren, aber ich würde gerne wissen, warum es dort ist. Ich kann nur annehmen, dass es etwas mit meinen beiden Fanggruppen zu tun hat. Wo ist mein Fehler?

Antwort

8

Ja, Sie erhalten zwei Captures, weil Sie in Ihrem regulären Ausdruck zwei Capturing-Gruppen haben.

Um die unerwünschte Erfassung vermeiden Sie eine nicht-einfangende Gruppe (?:...) verwenden:

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

Sie müssen Gruppen in Ihrem RE, so dass Sie 2 Übereinstimmungen erhalten. Was ist überraschend? Jedes Klammerpaar ist eine Gruppe.

+0

Es hilft zu wissen, wie man eine Gruppe nicht gefangen macht;) – Kim

1

Ich kann es etwas mit meinen beiden Einfanggruppen zu tun hat, nur annehmen.

Ihre Annahme richtig ist

Wo ist mein Fehler?

Es gibt keinen Fehler, alles verhält sich wie erwartet.

Verwandte Themen