2016-05-06 8 views
0

Ich habe mich eine Weile umgesehen und konnte nicht finden, was ich suche, oder vielleicht weiß ich einfach nicht genug, um zu wissen, wonach ich suche ...Regex Problem mit Capturing-Gruppe PHP

Ich habe eine Situation, in der ich erfassen und Ausdruck umgeben von Klammern, die ein alphabetisches Zeichen zwischen 1 und 5 Zeichen lang ist. Das ist nicht schwer. Als nächstes möchte ich die genaue Zeichenfolge (AP) von meiner Suche ausschließen.

Ich benutze Regex101 und ich bekomme anscheinend eine Übereinstimmung in der Zeichenfolge, die ich bekommen möchte (oder den Platz direkt davor), aber die Übereinstimmung gibt nur '' 'zurück und nicht die volle (EXC), die ich will . Hier ist der Regex, den ich gerade habe:

/((?=\(\D{1,5}\)))(?:.(?!AP))/gism 

Alle Vorschläge oder Hinweise in die richtige Richtung; Ich werde bei Bedarf weitere Informationen bereitstellen. Hier

+2

Die Regex funktioniert auf Regex101, aber nicht PHP? Veröffentlichen Sie Ihre PHP-Nutzung und/oder Regex101-Link. Erstens, es gibt keinen 'g' Modifikator in PHP. – chris85

+1

Chris ist richtig, verwenden Sie preg_match_all anstelle von preg_match als Umgehungsmöglichkeit – rjdown

+0

Nein der Ausdruck passt nicht den gesamten Ausdruck ich will es, es sagt, es stimmt, aber nicht den richtigen Begriff. In regX101 lautet die Übereinstimmungsinformation: 1. [28-28] '' –

Antwort

1

ist ein Vergleich der Regex zuerst hatte, und die Regex, die (Leerzeichen hinzugefügt) funktioniert:

/((?= \(\D{1,5}\))) (?: .(?!AP))/gism 
/(( \D{1,5} )) (?<! ( AP))/gism 

Ihr erstes Muster wird die öffnende Klammer passen, wenn sie um etwas nicht numerisch sind, die nicht der Fall ist Beginnen Sie mit ap. Look arounds stimmen nicht überein, denken Sie daran. (Der Punkt ist das einzige Zeichen, das sich nicht in der Umgebung befindet.)

Das andere Muster entfernt die wörtliche Klammer: \( und \). Es entfernt auch das Blick voraus ?=, so dass Sie tatsächlich etwas erfassen. Der letzte Teil der Regex ist ein negativer Blick hinter sich. In diesem Fall wird lediglich verhindert, dass das Muster mit übereinstimmt, wenn das Ergebnis in ap endet.

Ich kann nicht erklären, warum das zweite Muster so viele unnötige Klammern hat, jedoch. Das ist äquivalent:

/(\D{1,5})(?<!AP)/gism