Ich verwende Capture-Gruppen in regulären Ausdrücken zum ersten Mal und ich frage mich, was mein Problem ist, da ich davon ausgehe, dass die Regex-Engine die Zeichenfolge von links nach rechts durchsucht.
Ich versuche, eine UpperCamelCase-Zeichenfolge in eine hyphened-Kleinbuchstaben-Zeichenfolge umzuwandeln, also zum Beispiel:
%Vor%Meine Voraussetzung ist eine alphabetische Zeichenfolge, sodass ich mich nicht um Zahlen oder andere Zeichen kümmern muss. Hier ist, was ich versucht habe:
%Vor%Das Ergebnis:
%Vor% Das ist fast das, was ich möchte, außer dass zwischen a
und test
ein Bindestrich stehen sollte. Ich habe A-Z
bereits in meine erste Capturing-Gruppe aufgenommen, also würde ich annehmen, dass die Engine AT
sieht und diese Bindestriche trennt.
Was mache ich falsch?
Der Grund, warum Ihre Regex nicht funktioniert: Überlappende Übereinstimmungen
sA
in IsATest
überein, sodass Sie -
zwischen s
und A
einfügen können.
-
zwischen A
und T
einzufügen, müsste die Regex mit AT
übereinstimmen. A
bereits als Teil von sA
übereinstimmt. Sie können keine überlappenden Übereinstimmungen in der direkten Regex haben. Mach es in zwei einfachen Zeilen
Hier ist der einfache Weg, es mit Regex zu tun:
%Vor%Sehen Sie sich die Ausgabe am Ende der php-Demo an:
Ausgabe:
hello-world-this-is-a-test
Wird in einem Moment eine Erklärung hinzufügen. :)
(?<=[a-zA-Z])
lookbehind behauptet, dass vor der aktuellen Position ein Buchstabe (?=[A-Z])
lookahead behauptet, dass der aktuellen Position ein Großbuchstabe folgt. -
und konvertieren das Los in Kleinbuchstaben. Wenn Sie sich diesen Bildschirm von regex101 genau ansehen, können Sie Zeilen zwischen den Wörtern sehen, in denen die Regex übereinstimmt.
>Referenz
Ich habe die zwei regulären Ausdrücke der Einfachheit halber getrennt:
%Vor%Er verarbeitet die Zeichenfolge zweimal, um Folgendes zu finden:
Dies wird das folgende Verhalten haben:
%Vor%Alternativ können Sie eine Look-Ahead-Assertion verwenden (dies bewirkt die Wiederverwendung des letzten Großbuchstabens, der im vorherigen Match verwendet wurde):
%Vor%Um den interessanten Anwendungsfall zu beheben, den Jack in Ihren Kommentaren erwähnt hat (Vermeiden Sie das Aufspalten von Abkürzungen), ging ich mit dem Weg von zx81, Lookahead und Lookbehinds zu verwenden.
%Vor%Sie können es zur Erklärung in zwei Teile aufteilen:
(TL; DR: Übereinstimmung zwischen Strings des CamelCase Patterns.)
(TL; DR: Sonderfall, Übereinstimmung zwischen Abkürzung und CamelCase-Muster)
Also wäre Ihr Code dann:
%Vor%Tags und Links string php regex camelcasing backreference