Gibt es eine einfache Möglichkeit, eine Zeichenfolge in Groß- und Kleinschreibung umzuwandeln? ZB john smith
wird John Smith
. Ich suche nicht nach etwas Kompliziertem wie John Resigs Lösung , sondern (hoffentlich) nach einer Art Ein- oder Zweiliner.
javascript
title-case
MDCore
quelle
quelle
Antworten:
Versuche dies:
quelle
\w\S*
anstelle von\w+
oder\w*
zum Beispiel verwendet wird? Ich weiß nicht, warum Sie etwas anderes als Leerzeichen einfügen und daher Jim-Bob in Jim-Bob ändern möchten .\w\S*
auch dasJim-bob
Problem auf unserer Seite verursacht. Mit\w*
gelöst./([^\W_]+[^\s-]*) */g
löst dasJim-Bob
Problem, dh:jim-bob
-->
Jim-Bob
jim-bob
-->
Jim-Bob
dein Wunsch ist, solltest du es wahrscheinlich tun/\b\w+/g
. Beispiel:str.replace(/\b\w+/g,function(s){return s.charAt(0).toUpperCase() + s.substr(1).toLowerCase();});
\w\S*
wird anstelle von\w+
oder verwendet,\w*
damit Wörter wieDon't
nicht geändert werdenDon'T
, aber wie andere darauf hingewiesen haben,\w\S*
verursacht dies Probleme mit Wörtern mit Bindestrich.Eine etwas elegantere Art, Greg Deans Funktion anzupassen:
Nennen Sie es wie:
quelle
Jo-Ann Smith
dieser eingibt, konvertiert dieser Code ihn inJo-ann Smith
(beachten Sie die Kleinbuchstabena
inAnn
).Versuchen Sie, die anzuwenden text-trans CSS Stil , um Ihre Kontrollen.
z.B:
(text-transform: capitalize);
Verwenden Sie einen JS-Ansatz nur, wenn dies unbedingt erforderlich ist.
quelle
Hier ist meine Version, IMO, es ist leicht zu verstehen und auch elegant.
quelle
str.split(' ').map(i => i[0].toUpperCase() + i.substring(1).toLowerCase()).join(' ')
.toLowerCase()
. Namen wie "McDonald" oder Akronyme wie "ASAP" sollten ihre Großbuchstaben behalten. Wenn jemand tatsächlich eine Zeichenfolge wie "heLLO" übergeben hat, sollte die Anwendung nicht davon ausgehen, dass die Großbuchstaben falsch sind.String.prototype.toTitleCase = function (blnForceLower) { var strReturn; (blnForceLower ? strReturn = this.toLowerCase() : strReturn = this); return strReturn .split(' ') .map(i => i[0].toUpperCase() + i.substr(1)) .join(' '); }
str
es sich um ein einzelnes Zeichen handelt.Hier ist meine Funktion, die in Groß- und Kleinschreibung konvertiert wird, aber auch definierte Akronyme als Groß- und Kleinwörter als Kleinbuchstaben beibehält:
Zum Beispiel:
quelle
/\w\S*/g
um/([^\W_]+[^\s-]*) */g
per @ awashburn Kommentar oben auf dem abzuhelfen./\b\w+/g
, das ich für schneller verständlich halte?/([^\W_]+[^\s-]*) */g
bis/\b\w+/g
pro @ Michael Kommentar; Bitte kommentieren Sie, wenn Sie einen Fall finden, in dem die kompliziertere Regex erforderlich ist./\b[\w-\']+/g
in geändert, um getrennte Wörter und Apostroph in Wörtern zuzulassen.Ich bevorzuge das Folgende gegenüber den anderen Antworten. Es stimmt nur mit dem ersten Buchstaben jedes Wortes überein und schreibt es groß. Einfacherer Code, einfacher zu lesen und weniger Bytes. Bestehende Großbuchstaben bleiben erhalten, um verzerrende Akronyme zu vermeiden. Sie können jedoch immer
toLowerCase()
zuerst Ihre Zeichenfolge aufrufen .Sie können dies zu Ihrem String-Prototyp hinzufügen, wodurch Sie
'my string'.toTitle()
Folgendes tun können:Beispiel:
Code-Snippet anzeigen
quelle
const titleCase = (str) => str.replace(/\b\S/g, t => t.toUpperCase());
NoT qUiITe
.toLowerCase
. Seien Sie sich nur bewusst, dass es Akronyme brechen würde.an HTML document
:An HTML Document
vsAn Html Document
toLowerCase
) flexibler / nützlicher ist als eine, die die Absichten der Entwickler voraussetzt. Diese Methode spiegelt auch die Funktionalität ähnlicher integrierter Methoden anderer Sprachen wie PHP (ucwords
) und Golang (strings.Title
) wider . .NETZ (TextInfo.ToTitleCase
Interessanterweise funktioniert ) für gemischte Groß- und Kleinschreibung, lässt aber auch vollständig großgeschriebene Zeichenfolgen unverändert.Ohne Regex nur als Referenz zu verwenden:
quelle
quelle
'string'.replace(/^(.)(.*)/,function(s,p1,p2){return p1.toUpperCase()+p2;})
Again, dies funktioniert nur zum Großschreiben des ersten Buchstabens einer Zeichenfolge, aber falls Sie dies benötigen, funktioniert meine Konstruktion.'$1'.toUpperCase()
, anscheinend ist der Großbuchstabe zum Zeitpunkt der Zuweisung des Werts noch nicht fertig. Mit der Funktion'string'.replace(/^(.){1}/,function(match) { return match.toUpperCase(); })
Sie könnten sofort
toLowerCase
die Zeichenfolge und dann nurtoUpperCase
den ersten Buchstaben jedes Wortes. Wird ein sehr einfacher 1 Liner:quelle
s => s.toUpperCase()
). Meine Variante ist, das zu tun, was Sie getan haben, aber das String-Objekt zu erweitern (so kontrovers das auch ist):Object.defineProperty(String.prototype, '_toProperCase', {value:function() {return this.toLowerCase().replace(/\b(\w)/g, function(t) {return t.toUpperCase()})}})
=>
, dass dies eine native Pfeilfunktion (ES6) ist. Der Link springt zu den Mozillla Docs auf ihnen, die auch eine Support-Tabelle bereitstellen.Nur für den Fall, dass Sie sich über diese Füllwörter Sorgen machen, können Sie der Funktion immer nur mitteilen, was nicht groß geschrieben werden soll.
Hoffe das hilft dir weiter.
bearbeiten
Wenn Sie mit führenden Leimwörtern umgehen möchten, können Sie diese mit einer weiteren Variablen verfolgen:
quelle
glue ='de|da|del|dos|do|das|des|la|della|delli'.split('|');
and another thing
wirdand Another Thing
. Benötigen Sie nur einen eleganten Weg, um immer das erste Wort groß zu schreiben.Wenn der in den oben genannten Lösungen verwendete reguläre Ausdruck Sie verwirrt, versuchen Sie diesen Code:
quelle
split
nicht wandeln es in ein Array, die Sie gerade sehen es nicht so offensichtlich , weilmap
Mittel für einen Benutzer haben keine[]
NotationIch habe diese Funktion erstellt, die Nachnamen (also keine Groß- und Kleinschreibung) wie "McDonald" oder "MacDonald" oder "O'Toole" oder "D'Orazio" verarbeiten kann. Deutsche oder niederländische Namen mit "van" oder "von", die oft in Kleinbuchstaben geschrieben sind, werden jedoch nicht behandelt. Ich glaube, "de" ist oft auch in Kleinbuchstaben wie "Robert de Niro". Diese müssten noch angegangen werden.
quelle
macy
Problem\b((m)(a?c))?(\w)
\b((m)(a?c))?(\w)(?!\s)
Scheint zu funktionieren ... Getestet mit dem oben Gesagten: "Der schnell braune Fuchs? / Springt / ^ über ^ den ¡faulen! Hund ..." und "C: / Programme / einige Anbieter / ihre 2. Anwendung / a file1.txt ".
Wenn Sie 2Nd anstelle von 2nd möchten, können Sie zu wechseln
/([a-z])(\w*)/g
.Die erste Form kann vereinfacht werden als:
quelle
Versuche dies
Beispiel
quelle
Wenn Sie in Ihrem Code Bibliotheken von Drittanbietern verwenden können, hat lodash eine Hilfsfunktion für uns.
https://lodash.com/docs/4.17.3#startCase
quelle
Versuchen Sie dies auf kürzestem Weg:
quelle
ES 6
sonst
quelle
s.slice(0, 1).toUpperCase()
wenn Sie noch diesen ersten Buchstaben wollen.str
.charAt(0).toUpperCase()
.Die meisten dieser Antworten scheinen die Möglichkeit der Verwendung des Wortgrenzen-Metazeichens (\ b) zu ignorieren. Eine kürzere Version von Greg Deans Antwort, die sie verwendet:
Funktioniert auch für getrennte Namen wie Jim-Bob.
quelle
\w
Enthält nur die Zeichen[A-Za-z0-9_]
, nicht alle Buchstaben. Dafür müssten Sie die Unicode-Kategorie verwenden\p{L}
. Sie benötigen den/u
Modifikator (siehe hier ) und eine andere Lösung für\b
, die nur zwischen\W
und\w
(siehe hier )Ich denke, das einfachste ist die Verwendung von CSS.
quelle
Verwenden Sie
/\S+/g
zur Unterstützung diakritische Zeichen:Allerdings: " s unshine ( y ellow)" ⇒ " S unshine ( y ellow)"
quelle
Ich wollte meine eigene Antwort hinzufügen, da ich eine robuste
toTitleCase
Funktion benötigte , die die hier aufgeführten Grammatikregeln berücksichtigt (von Google empfohlener Artikel). Es gibt verschiedene Regeln, die von der Länge der Eingabezeichenfolge abhängen. Unten finden Sie die Funktion + Unit-Tests.Die Funktion konsolidiert auch Leerzeichen und entfernt Sonderzeichen (ändern Sie den regulären Ausdruck an Ihre Bedürfnisse).
toTitleCase-Funktion
Unit-Tests zur Sicherstellung der Richtigkeit
Bitte beachten Sie, dass ich einige Sonderzeichen aus den bereitgestellten Zeichenfolgen entferne. Sie müssen den regulären Ausdruck anpassen, um die Anforderungen Ihres Projekts zu erfüllen.
quelle
quelle
o'henry
aber komische Sachen mithorse's mouth
."john f. kennEdy".toLowerCase().replace(/\b\S/g, t => t.toUpperCase())
besser 🤔\b
und\S
sind Sonderzeichenklassen , die "Wortgrenze" und "einzelnes Nicht-Leerzeichen" bezeichnen. Der reguläre Ausdruck stimmt also mit jedem einzelnen Zeichen überein, das einer Wortgrenze folgt, und aktiviert dieses Zeichen durch Anwenden der angegebenen Pfeilfunktion.Mit der "lewax00" -Lösung habe ich diese einfache Lösung erstellt, die "w" beginnend mit Leerzeichen oder "w" erzwingt, die de word initiieren, aber die zusätzlichen Zwischenräume nicht entfernen kann.
Das Ergebnis ist "Sofía Vergara".
quelle
Hier ist meine Funktion, die sich um akzentuierte Zeichen kümmert (wichtig für Französisch!) Und die Behandlung von niedrigeren Ausnahmen ein- und ausschalten kann. Ich hoffe, das hilft.
quelle
Wir haben hier im Büro eine Diskussion geführt und sind der Meinung, dass der Versuch, die Art und Weise, wie Personen Namen eingeben, automatisch so zu korrigieren, wie Sie es möchten, mit möglichen Problemen behaftet ist.
Wir haben uns mehrere Fälle ausgedacht, in denen verschiedene Arten der automatischen Großschreibung auseinanderfallen und diese nur für englische Namen gelten. Jede Sprache hat ihre eigene Komplexität.
Probleme beim Großschreiben des ersten Buchstabens jedes Namens:
• Akronyme wie IBM dürfen nicht eingegeben werden und werden zu Ibm.
• Der Name McDonald würde sich in Mcdonald verwandeln, was falsch ist, das gleiche gilt auch für MacDonald.
• Doppelte Namen wie Marie-Tonks würden zu Marie-Tonks.
• Namen wie O'Connor würden zu O'connor.
Für die meisten von ihnen könnten Sie benutzerdefinierte Regeln schreiben, um damit umzugehen. Dies hat jedoch weiterhin Probleme mit Akronymen wie zuvor und Sie erhalten ein neues Problem:
• Wenn Sie eine Regel hinzufügen, um Namen mit Mac wie MacDonald zu korrigieren, werden die Unterbrechungsnamen wie Macy zu MacY.
Die einzige Lösung, die wir gefunden haben und die niemals falsch ist, besteht darin, jeden Buchstaben groß zu schreiben, was eine Brute-Force-Methode ist, die das DBS anscheinend auch verwendet.
Wenn Sie also den Prozess automatisieren möchten, ist es so gut wie unmöglich, auf ein Wörterbuch mit jedem einzelnen Namen und Wort zu verzichten und darauf, wie es kapituliert werden sollte. Wenn Sie keine Regel haben, die alles abdeckt, verwenden Sie es nicht so, wie es ist ärgert nur Ihre Benutzer und fordert Personen, die ihre Namen korrekt eingeben möchten, auf, woanders hinzugehen.
quelle
Hier ist eine andere Lösung mit CSS (und Javascript, wenn der zu transformierende Text in Großbuchstaben geschrieben ist):
html
js
CSS
quelle
Für diejenigen von uns, die Angst vor regulären Ausdrücken haben (lol):
quelle
Meine einzeilige Lösung:
Anschließend können Sie die Methode
capitalizeWords()
für eine beliebige Zeichenfolge aufrufen . Zum Beispiel:Meine andere Lösung:
Anschließend können Sie die Methode
capitalizeWords()
für eine beliebige Zeichenfolge aufrufen . Zum Beispiel:Alternative Lösung basierend auf Greg Dean Antwort:
Anschließend können Sie die Methode
capitalizeWords()
für eine beliebige Zeichenfolge aufrufen . Zum Beispiel:quelle
Überrascht zu sehen, dass niemand die Verwendung von Ruheparametern erwähnte. Hier ist ein einfacher Einzeiler, der ES6 Rest-Parameter verwendet.
quelle
Dies basiert auf meiner Lösung für FreeCodeCamps Bonfire "Title Case" , bei der Sie zuerst die angegebene Zeichenfolge in Kleinbuchstaben konvertieren und dann jedes Zeichen, das ein Leerzeichen in Großbuchstaben umwandelt, konvertieren müssen.
Ohne Regex zu verwenden:
quelle