Split camelCase-Wort in Wörter mit php preg_match (Regulärer Ausdruck)
Wie würde ich mich über die Spaltung das Wort:
oneTwoThreeFour
in ein array, so dass ich bekommen kann:
one Two Three Four
mit preg_match
?
Ich müde, doch es gibt nur das ganze Wort
$words = preg_match("/[a-zA-Z]*(?:[a-z][a-zA-Z]*[A-Z]|[A-Z][a-zA-Z]*[a-z])[a-zA-Z]*\b/", $string, $matches)`;
Vielleicht ist meine Frage kann Ihnen helfen, fragte ich dasselbe gestern, aber über die Java - stackoverflow.com/questions/4502273/...
InformationsquelleAutor Good-bye | 2010-12-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie auch
preg_match_all
:Erklärung:
Nein, weil die äußeren Klammern erfassen die GANZE Gruppe, einschließlich der sub-Gruppe. Es ist eine sub-Gruppe, die er nicht überladen wollen die $matches-Auflistung.
dies entspricht zweimal, ideone.com/VsUjmf
Dies scheiterte für mich mit "TestID" mit: "preg_match_all('/((?:^|[A-Z])[a-z]+)/', $key, $matches); die(implode(' ', $matches[0]));" weil er nicht wie die AUFEINANDER folgende MÜTZEN-Problem. Ich brauchte, um split-groß-und Kleinschreibung mit Leerzeichen und @blak3r die Lösung bei mir funktioniert: stackoverflow.com/a/17122207/539149
Bessere Lösung für Zeichenketten wie
HTMLParser
dass es funktionieren wird: stackoverflow.com/a/6572999/1697320.InformationsquelleAutor codaddict
Können Sie
preg_split
:Sehen
Ich bin im Grunde die Aufteilung der input-string kurz vor den Großbuchstaben. Die regex verwendet
(?=[A-Z])
entspricht dem Punkt direkt vor einem Großbuchstaben.InformationsquelleAutor codaddict
Ich weiß, dass dies ist eine alte Frage mit einer akzeptierten Antwort, aber IMHO gibt es eine bessere Lösung:
Beachten Sie, dass dieser regex, (wie codaddict ist
'/(?=[A-Z])/'
Lösung, die funktioniert wie ein Charme für gut gebildet, camelCase), passt nur eine position innerhalb der Zeichenfolge und verbraucht gar keinen text. Diese Lösung hat den zusätzlichen Vorteil, dass es auch funktioniert nicht-so-gut-gebildet pseudo-camelcase-Wörter wie:StartsWithCap
und:hasConsecutiveCAPS
.Eingang:
oneTwoThreeFour
StartsWithCap
hasConsecutiveCAPS
NewNASAModule
Ausgabe:
Word 1 of 4 = "one"
Word 2 of 4 = "Two"
Word 3 of 4 = "Three"
Word 4 of 4 = "Four"
Word 1 of 3 = "Starts"
Word 2 of 3 = "With"
Word 3 of 3 = "Cap"
Word 1 of 3 = "has"
Word 2 of 3 = "Consecutive"
Word 3 of 3 = "CAPS"
Word 1 of 3 = "New"
Word 2 of 3 = "NASA"
Word 3 of 3 = "Module"
Bearbeitet: 2014-04-12: Modifizierte regex-Skript und test-Daten korrekt aufgeteilt:
"NewNASAModule"
Fall (in Reaktion auf die rr ' s Kommentar).Es scheint ein problem mit Zeichenfolgen wie
NewNASAModule
(Ausgänge:[New, NASAModule]
; ich würde erwarten, dass[New, NASA, Module]
)Ja, Sie sind richtig. Siehe meine andere Antwort aktualisiert teilt:
NewNASAModule
richtig: RegEx, split camelCase oder TitleCase (advanced)InformationsquelleAutor ridgerunner
Einen functionized version von @ridgerunner Antwort.
InformationsquelleAutor blak3r
Während ridgerunner Antwort funktioniert Super, es scheint nicht zu funktionieren mit all-caps Teilstrings, erscheinen in der Mitte des Satzes. Ich benutze folgenden, und es scheint, mit diesen umzugehen just alright:
Einige Testfälle:
InformationsquelleAutor rr-
Der trick ist, eine wiederholbare Muster $1 $2$1 $2 oder niedrigeren UPPERlower UPPERlower etc....
zum Beispiel
helloWorld = $1 entspricht "Hallo", $2 entspricht "W" und $1 entspricht "orld" wieder so kurz Sie bekommen $1 $2$1 " oder "Hallo Welt", matches HelloWorld $2$1 $2$1 "oder" erneut "Hallo Welt". Dann senken Sie den Fall, Sie Großschreibung das erste Wort oder explodieren Sie auf den Raum, oder verwenden Sie einen _ oder einen anderen Charakter zu bewahren Sie diese getrennt.
Kurz und einfach.
InformationsquelleAutor ArtisticPheonix
Nahm ich cool guy Ridgerunner code (oben) und in eine Funktion:
Zurückkehren:
New NASA Module
InformationsquelleAutor Jarrod
Eine weitere option ist das passende
/[A-Z]?[a-z]+/
- wenn Sie wissen, Ihre Eingabe auf das richtige format, es sollte gut funktionieren.[A-Z]?
würde mit einem Großbuchstaben (oder gar nichts).[a-z]+
würde dann passen alle folgenden Kleinbuchstaben, bis das nächste match.Beispiel: https://regex101.com/r/kNZfEI/1
Ich bekomme "Lösung wurde nicht gefunden" für Ihre arbeiten Beispiel
Danke, aktualisiert. ideone abgelaufene alte Beispiele an einem gewissen Punkt, so viele alte Beispiele sind noch kaputt.
danke. nur damit Sie es wissen, ich klebte die Geltendmachung text aus dem Beitrag von rr - und diejenigen, die mit mehreren Kappen zusammen nicht funktionieren. regex101.com/r/kNZfEI/2
InformationsquelleAutor Kobi
Bei der Bestimmung der besten Muster für Ihr Projekt, müssen Sie berücksichtigen die folgenden Faktoren Muster:
Den oben genannten Faktoren auch zufällig in der gleichen hierarchischen Reihenfolge, die danach Streben, zu gehorchen. In anderen Worten, es macht nicht viel Sinn für mich zu priorisieren, 2, 3, oder 4, wenn 1 nicht ganz erfüllen die Anforderungen. Die Lesbarkeit ist am unteren Ende der Liste für mich, weil in den meisten Fällen kann ich Sie die syntax.
Capture Gruppen und Lookarounds beeinflussen sich oft Muster an Effizienz. Die Wahrheit ist, es sei denn, Sie sind der Ausführung dieses regex auf Tausende von Eingabe-strings, gibt es keine Notwendigkeit zu schuften über Effizienz. Es ist vielleicht noch wichtig, zu konzentrieren auf Muster der Lesbarkeit die im Zusammenhang mit pattern Kürze.
Einige Muster unten erfordern eine zusätzliche Behandlung/Kennzeichnen durch Ihre
preg_
- Funktion, aber hier sind einige Muster-Vergleiche auf der Basis der OP-sample-Eingang: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 Stufen)/([a-z0-9])([A-Z])/
(68 Schritte)/(?<=[a-z])(?=[A-Z])/x
(94 -) Schritte ...für die Aufnahme, diex
ist nutzlos./(?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])/
(134 Stufen)preg_match_all()
Muster:/[A-Z]?[a-z]+/
(14 Schritte)/((?:^|[A-Z])[a-z]+)/
(35 Schritte)Werde ich darauf hinweisen, dass es einen subtilen Unterschied zwischen den Ausgang des
preg_match_all()
undpreg_split()
.preg_match_all()
wird die Ausgabe einer 2-dimensionalen array, in anderen Worten, alle fullstring Spiele werden in der[0]
subarray; wenn es eine Aufnahme-Gruppe verwendet, diese Teilstrings werden in der[1]
subarray. Auf der anderen Seitepreg_split()
gibt nur ein 1-dimensionales array und bietet daher ein weniger aufgebläht und mehr der direkte Weg zu der gewünschten Ausgabe.Einige der Muster sind nicht genügend beim Umgang mit camelCase-strings, die eine ALLCAPS/acronym substring in Ihnen. Wenn das ein fringe Fall, dass möglich in Ihrem Projekt, ist es logisch, auch nur in Betracht ziehen, Muster, Griff diesen Fällen richtig. Ich werde nicht testen TitleCase input-strings, da, schleichen sich zu weit von der Frage.
Neuen Erweiterten Akku des Test-Strings:
Geeignet
preg_split()
Muster:/[a-z]+\K|(?=[A-Z][a-z]+)/
(149 Schritte) *ich musste[a-z]
für die demo zu zählen richtig/(?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])/
(547 Schritte)Geeignet
preg_match_all()
Muster:/[A-Z]?[a-z]+|[A-Z]+(?=[A-Z][a-z]|$)/
(75 Stufen)Schließlich, meine Empfehlungen basieren auf meinen Muster-Prinzipien /Faktor Hierarchie. Außerdem empfehle ich
preg_split()
überpreg_match_all()
(trotz der Muster, das weniger Schritte) als eine Frage der Direktheit, um die gewünschte Ausgabe-Struktur. (natürlich wählen, was Sie mögen)Code: (Demo)
Code: (Demo)
InformationsquelleAutor mickmackusa
Können Sie split auf einer "glide" von klein-zu Großbuchstaben so:
Dummerweise werden Sie dann wieder neu aufbauen müssen die Wörter aus den entsprechenden Paaren der Elemente in $Teile
Hoffe, das hilft
InformationsquelleAutor Daniel Rhodes
Zunächst codaddict vielen Dank für Ihre Muster, es hat mir sehr geholfen!
Brauchte ich eine Lösung, die funktioniert im Falle einer Präposition 'a' vorhanden ist:
z.B. thisIsACamelcaseSentence.
Fand ich die Lösung, dabei einen zwei-Schritt preg_match und aus einer Funktion mit einigen Optionen:
Fühlen Sie sich frei, es zu benutzen, und im Fall es ist ein 'einfacher' Weg, um dies in einem Arbeitsschritt tun kommentieren Sie bitte!
InformationsquelleAutor joronimo
Volle Funktion basiert auf dem @codaddict Antwort:
InformationsquelleAutor guizo