Bei der Ermittlung des besten Musters für Ihr Projekt müssen Sie die folgenden Musterfaktoren berücksichtigen:
- Genauigkeit (Robustheit) - ob das Muster in allen Fällen korrekt und einigermaßen zukunftssicher ist
- Effizienz - Das Muster sollte direkt und bewusst sein und unnötige Arbeit vermeiden
- Kürze - Das Muster sollte geeignete Techniken verwenden, um unnötige Zeichenlängen zu vermeiden
- Lesbarkeit - Das Muster sollte so einfach wie möglich gehalten werden
Die oben genannten Faktoren liegen zufällig auch in der hierarchischen Reihenfolge, die zu befolgen versucht. Mit anderen Worten, es macht für mich wenig Sinn, 2, 3 oder 4 zu priorisieren, wenn 1 die Anforderungen nicht ganz erfüllt. Die Lesbarkeit steht für mich ganz unten auf der Liste, da ich in den meisten Fällen der Syntax folgen kann.
Erfassungsgruppen und Lookarounds wirken sich häufig auf die Mustereffizienz aus. Die Wahrheit ist, dass Sie nicht über die Effizienz hinarbeiten müssen, es sei denn, Sie führen diesen regulären Ausdruck für Tausende von Eingabezeichenfolgen aus. Es ist vielleicht wichtiger, sich auf die Lesbarkeit von Mustern zu konzentrieren, die mit der Kürze des Musters verbunden sein können.
Einige der folgenden Muster erfordern eine zusätzliche Behandlung / Kennzeichnung durch ihre preg_
Funktion, aber hier sind einige Mustervergleiche, die auf der Beispieleingabe des OP basieren:
preg_split()
Muster:
/^[^A-Z]+\K|[A-Z][^A-Z]+\K/
(21 Schritte)
/(^[^A-Z]+|[A-Z][^A-Z]+)/
(26 Schritte)
/[^A-Z]+\K(?=[A-Z])/
(43 Schritte)
/(?=[A-Z])/
(50 Schritte)
/(?=[A-Z]+)/
(50 Schritte)
/([a-z]{1})[A-Z]{1}/
(53 Schritte)
/([a-z0-9])([A-Z])/
(68 Schritte)
/(?<=[a-z])(?=[A-Z])/x
(94 Schritte) ... für die Aufzeichnung ist das x
nutzlos.
/(?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])/
(134 Schritte)
preg_match_all()
Muster:
/[A-Z]?[a-z]+/
(14 Schritte)
/((?:^|[A-Z])[a-z]+)/
(35 Schritte)
Ich werde darauf hinweisen, dass es einen subtilen Unterschied zwischen der Ausgabe von preg_match_all()
und gibt preg_split()
. preg_match_all()
gibt ein zweidimensionales Array aus, mit anderen Worten, alle Fullstring-Übereinstimmungen befinden sich im [0]
Subarray; Wenn eine Erfassungsgruppe verwendet wird, befinden sich diese [1]
Teilzeichenfolgen im Subarray. Andererseits gibt preg_split()
nur ein eindimensionales Array aus und bietet daher einen weniger aufgeblähten und direkteren Pfad zur gewünschten Ausgabe.
Einige der Muster sind unzureichend, wenn es sich um camelCase-Zeichenfolgen handelt, die einen ALLCAPS / Akronym-Teilstring enthalten. Wenn dies ein Randfall ist, der in Ihrem Projekt möglich ist, ist es logisch, nur Muster zu berücksichtigen, die diese Fälle korrekt behandeln. Ich werde keine TitleCase-Eingabezeichenfolgen testen, da dies zu weit von der Frage entfernt ist.
Neue erweiterte Batterie von Teststrings:
oneTwoThreeFour
hasConsecutiveCAPS
newNASAModule
USAIsGreatAgain
Geeignete preg_split()
Muster:
/[a-z]+\K|(?=[A-Z][a-z]+)/
(149 Schritte) * Ich musste verwenden, [a-z]
damit die Demo richtig zählt
/(?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])/
(547 Schritte)
Geeignetes preg_match_all()
Muster:
/[A-Z]?[a-z]+|[A-Z]+(?=[A-Z][a-z]|$)/
(75 Schritte)
Schließlich meine Empfehlungen basierend auf meinen Musterprinzipien / Faktorhierarchie. I auch empfehlen preg_split()
über preg_match_all()
(trotz der Muster weniger Schritten) als eine Angelegenheit von Unmittelbarkeit auf die gewünschte Ausgabestruktur. (Natürlich wählen Sie, was Sie möchten)
Code: ( Demo )
$noAcronyms = 'oneTwoThreeFour';
var_export(preg_split('~^[^A-Z]+\K|[A-Z][^A-Z]+\K~', $noAcronyms, 0, PREG_SPLIT_NO_EMPTY));
echo "\n---\n";
var_export(preg_match_all('~[A-Z]?[^A-Z]+~', $noAcronyms, $out) ? $out[0] : []);
Code: ( Demo )
$withAcronyms = 'newNASAModule';
var_export(preg_split('~[^A-Z]+\K|(?=[A-Z][^A-Z]+)~', $withAcronyms, 0, PREG_SPLIT_NO_EMPTY));
echo "\n---\n";
var_export(preg_match_all('~[A-Z]?[^A-Z]+|[A-Z]+(?=[A-Z][^A-Z]|$)~', $withAcronyms, $out) ? $out[0] : []);