Wie kann ich einen String mit Javascript Regex in einen Kamelfall konvertieren?
EquipmentClass name
oder
Equipment className
oder equipment class name
oderEquipment Class Name
sollten alle werden : equipmentClassName
.
javascript
regex
camelcasing
Scott Klarenbach
quelle
quelle
Antworten:
Wenn Sie sich Ihren Code ansehen, können Sie ihn mit nur zwei
replace
Aufrufen erreichen:Bearbeiten: Oder mit einem einzigen
replace
Anruf, wobei die Leerzeichen auch in der erfasst werdenRegExp
.quelle
camelize("Let's Do It!") === "let'SDoIt!"
trauriges Gesicht . Ich werde es selbst versuchen, aber ich fürchte, ich werde nur einen weiteren Ersatz hinzufügen.return this.replace(/[^a-z ]/ig, '').replace(/(?:^\w|[A-Z]|\b\w|\s+)/g,
...const toCamelCase = (str) => str.replace(/(?:^\w|[A-Z]|\b\w)/g, (ltr, idx) => idx === 0 ? ltr.toLowerCase() : ltr.toUpperCase()).replace(/\s+/g, '');
.toLowerCase()
Methode in verketten . mit @ tabrindle Lösung oben:const toCamelCase = (str) => str.toLowerCase().replace(/(?:^\w|[A-Z]|\b\w)/g, (ltr, idx) => idx === 0 ? ltr.toLowerCase() : ltr.toUpperCase()).replace(/\s+/g, '');
Wenn jemand lodash benutzt , gibt es eine
_.camelCase()
Funktion.quelle
Am Ende habe ich das gemacht:
Ich habe versucht zu vermeiden, mehrere Ersetzungsanweisungen miteinander zu verketten. Etwas, bei dem ich $ 1, $ 2, $ 3 in meiner Funktion hätte. Aber diese Art der Gruppierung ist schwer zu verstehen, und Ihre Erwähnung von Cross-Browser-Problemen ist etwas, woran ich auch nie gedacht habe.
quelle
this.valueOf()
anstatt zu übergebenstr
. Alternativ (wie in meinem Fall),this.toLowerCase()
da sich meine Eingabezeichenfolgen in ALL CAPS befanden, bei denen die Nicht-Buckel-Teile nicht richtig in Kleinbuchstaben geschrieben waren. Mit using wird nurthis
das Zeichenfolgenobjekt selbst zurückgegeben, das eigentlich ein Array von Zeichen ist, daher der oben erwähnte TypeError.Sie können diese Lösung verwenden:
quelle
toCamelCase
Funktion macht genau das.ES5
ES6
Hinweis:
Für Sprachen mit Akzenten.
À-ÖØ-öø-ÿ
Fügen Sie der Regex Folgendes hinzu.replace(/[^a-zA-ZÀ-ÖØ-öø-ÿ0-9]+(.)/g
quelle
https://stackoverflow.com/posts/52551910/revisions
ES6 hinzugefügt , ich habe es nicht getestet. Ich werde überprüfen und aktualisieren.In Scotts speziellem Fall würde ich mich für etwas entscheiden wie:
Der reguläre Ausdruck stimmt mit dem ersten Zeichen überein, wenn er mit einem Großbuchstaben beginnt, und mit jedem alphabetischen Zeichen, das auf ein Leerzeichen folgt, dh zwei- oder dreimal in den angegebenen Zeichenfolgen.
Durch Aufpeppen des regulären Ausdrucks
/^([A-Z])|[\s-_](\w)/g
werden auch Bindestriche und Unterstriche von Typnamen getarnt.quelle
+
) hinzufügen , dh:/^([A-Z])|[\s-_]+(\w)/g
Ich habe versucht, eine JavaScript-Funktion für
camelCase
eine Zeichenfolge zu finden, und wollte sicherstellen, dass Sonderzeichen entfernt werden (und ich hatte Probleme zu verstehen, was einige der obigen Antworten taten). Dies basiert auf der Antwort von cc young mit zusätzlichen Kommentaren und dem Entfernen von $ peci & l-Zeichen.quelle
Zuverlässiges Arbeitsbeispiel, das ich seit Jahren verwende:
Groß- / Kleinschreibung ändernde Zeichen:
-
_
.
quelle
Wenn kein regulärer Ausdruck erforderlich ist, sollten Sie sich den folgenden Code ansehen, den ich vor langer Zeit für Twinkle erstellt habe :
Ich habe keine Leistungstests durchgeführt, und Regexp-Versionen sind möglicherweise schneller oder nicht.
quelle
Mein ES6- Ansatz:
quelle
quelle
lodash kann den Trick sicher und gut machen:
Obwohl es sich
lodash
möglicherweise um eine "große" Bibliothek handelt (~ 4 KB), enthält sie viele Funktionen, für die Sie normalerweise ein Snippet verwenden oder selbst erstellen würden.quelle
Hier ist ein Einzeiler, der die Arbeit erledigt:
Es teilt die Zeichenfolge in Kleinbuchstaben basierend auf der Liste der in RegExp bereitgestellten Zeichen auf
[.\-_\s]
(fügen Sie mehr in [] hinzu!) Und gibt ein Wortarray zurück. Anschließend wird das Array von Zeichenfolgen auf eine verkettete Zeichenfolge mit Großbuchstaben reduziert. Da die Reduzierung keinen Anfangswert hat, werden die ersten Buchstaben beginnend mit dem zweiten Wort in Großbuchstaben geschrieben.Wenn Sie PascalCase möchten, fügen Sie der Reduktionsmethode einfach eine anfängliche leere Zeichenfolge hinzu
,'')
.quelle
Nach dem lesbaren Ansatz von @ Scott ein wenig Feinabstimmung
quelle
wenig modifizierte Scotts Antwort:
jetzt ersetzt es auch '-' und '_'.
quelle
Alle 14 Permutationen unten erzeugen das gleiche Ergebnis von "deviceClassName".
quelle
Sie können diese Lösung verwenden:
quelle
Weil diese Frage noch eine andere Antwort brauchte ...
Ich habe mehrere der vorherigen Lösungen ausprobiert, und alle hatten den einen oder anderen Fehler. Einige haben die Interpunktion nicht entfernt; Einige behandelten Fälle mit Zahlen nicht. Einige haben nicht mehrere Satzzeichen hintereinander verarbeitet.
Keiner von ihnen handhabte eine Schnur wie
a1 2b
. Für diesen Fall gibt es keine explizit definierte Konvention, aber einige andere Fragen zum Stapelüberlauf schlugen vor, die Zahlen durch einen Unterstrich zu trennen.Ich bezweifle, dass dies die performanteste Antwort ist (drei reguläre Ausdrücke durchlaufen die Zeichenfolge und nicht eine oder zwei), aber sie besteht alle Tests, die mir einfallen. Um ehrlich zu sein, kann ich mir keinen Fall vorstellen, in dem Sie so viele Kamel-Fall-Konvertierungen durchführen, dass die Leistung von Bedeutung wäre.
(Ich habe dies als npm-Paket hinzugefügt . Es enthält auch einen optionalen booleschen Parameter, um Pascal Case anstelle von Camel Case zurückzugeben.)
Testfälle (Scherz)
quelle
Da ist meine Lösung:
quelle
Diese Methode scheint die meisten Antworten hier zu übertreffen, sie ist jedoch ein bisschen hackig, keine Ersetzungen, keine Regex, sondern einfach eine neue Zeichenfolge aufzubauen, die camelCase ist.
quelle
Dies baut auf der Antwort von CMS auf, indem nicht alphabetische Zeichen einschließlich Unterstrichen entfernt werden, die
\w
nicht entfernt werden.quelle
Oberes Kamelgehäuse ("TestString") bis unteres Kamelgehäuse ("testString") ohne Verwendung von Regex (seien wir ehrlich, Regex ist böse):
quelle
Am Ende habe ich eine etwas aggressivere Lösung gefunden:
In diesem obigen Abschnitt werden alle nicht alphanumerischen Zeichen und Kleinbuchstaben von Wörtern entfernt, die ansonsten in Großbuchstaben bleiben würden, z
Size (comparative)
=>sizeComparative
GDP (official exchange rate)
=>gdpOfficialExchangeRate
hello
=>hello
quelle
quelle
Hier ist mein Vorschlag:
oder
Testfälle:
quelle
Ich weiß, dass dies eine alte Antwort ist, aber dies behandelt sowohl Leerzeichen als auch _ (lodash)
quelle
"
zu geben.replace(/_/g", " ")
, der Kompilierungsfehler verursacht.quelle
EDIT : Jetzt in IE8 ohne Änderungen arbeiten.
EDIT : Ich war in der Minderheit darüber, was camelCase eigentlich ist (Hauptzeichen Kleinbuchstaben vs. Großbuchstaben.). Die gesamte Gemeinde glaubt, dass ein führender Kleinbuchstabe ein Kamelfall und ein führendes Kapital ein Pascalfall ist. Ich habe zwei Funktionen erstellt, die nur Regex-Muster verwenden. :) Also verwenden wir ein einheitliches Vokabular. Ich habe meine Haltung geändert, um der Mehrheit zu entsprechen.
Ich glaube, Sie brauchen in beiden Fällen nur einen einzigen regulären Ausdruck:
oder
In Funktionen: Sie werden feststellen, dass in diesen Funktionen das Ersetzen jedes Nicht-Az durch ein Leerzeichen gegen eine leere Zeichenfolge austauscht. Dies dient dazu, Wortgrenzen für die Großschreibung zu erstellen. "hallo-MEINE # Welt" -> "HalloMyWorld"
Anmerkungen:
Genießen
quelle
Ich denke das sollte funktionieren ..
quelle
Verwenden Sie String.prototype.toCamelCase () nicht, da String.prototypen schreibgeschützt sind. Die meisten js-Compiler geben diese Warnung aus.
Wie ich können diejenigen, die wissen, dass die Zeichenfolge immer nur ein Leerzeichen enthält, einen einfacheren Ansatz verwenden:
Haben Sie einen guten Tag. :) :)
quelle