Großschreibung von Wörtern in Zeichenfolgen

181

Was ist der beste Ansatz, um Wörter in einer Zeichenfolge groß zu schreiben?

vsync
quelle
66
Wenn es zur Anzeige ist, verwenden Sie CSS. text-transform:capitalize;.
Kennytm
3
Hiermit wird das Attribut "title" für DOM-Elemente festgelegt. kein CSS :)
vsync
1
Außerdem habe ich diese Frage gestellt, obwohl ich die Lösung kenne, nur weil ich versucht habe, sie auf dieser Website zu suchen und keine anständige Lösung gefunden habe. Deshalb habe ich sie aus Gründen der Dokumentation hinzugefügt.
vsync
1
@KennyTM: Die Texttransformation würde die Werte der Fieds der Form nicht wirklich großschreiben, alle Werte würden großgeschrieben dargestellt, sondern so wie sie sind an den Server gesendet.
Marco Demaio
8
@Marco: Ja, deshalb habe ich gesagt "Wenn es für die Anzeige ist".
Kennytm

Antworten:

286
/**
 * Capitalizes first letters of words in string.
 * @param {string} str String to be modified
 * @param {boolean=false} lower Whether all other letters should be lowercased
 * @return {string}
 * @usage
 *   capitalize('fix this string');     // -> 'Fix This String'
 *   capitalize('javaSCrIPT');          // -> 'JavaSCrIPT'
 *   capitalize('javaSCrIPT', true);    // -> 'Javascript'
 */
const capitalize = (str, lower = false) =>
  (lower ? str.toLowerCase() : str).replace(/(?:^|\s|["'([{])+\S/g, match => match.toUpperCase());
;

  • behebt die Lösung von Marco Demaio , bei der der erste Buchstabe mit einem vorangestellten Leerzeichen nicht groß geschrieben wird.
capitalize(' javascript'); // -> ' Javascript'
  • kann mit nationalen Symbolen und Buchstaben mit Akzent umgehen.
capitalize('бабушка курит трубку');  // -> 'Бабушка Курит Трубку'
capitalize('località àtilacol')      // -> 'Località Àtilacol'
  • kann mit Anführungszeichen und Klammern umgehen.
capitalize(`"quotes" 'and' (braces) {braces} [braces]`);  // -> "Quotes" 'And' (Braces) {Braces} [Braces]
enttäuscht
quelle
4
Regexp funktioniert wie "Nehmen Sie alle Nicht-Leerzeichen (\ S), die direkt am Anfang der Zeichenfolge (^) oder nach Leerzeichen (\ s) stehen, und
schreiben Sie
3
Eine kleine Verbesserung für die Behandlung von Großbuchstaben :) ** String.prototype.capitalize = function () {return this.toLowerCase (). Replace (/ (?: ^ | \ S) \ S / g, Funktion (a) {return a.toUpperCase ();}); }; **
SuryaPavan
1
Bitte ändern Sie nicht die Prototypen vorhandener Objekte.
Ascherer
1
@ Dr.X, siehe Add-On , 'CHECK THIS OUT'.capitalize(true) -> "Check This Out". Mind- trueParameter.
16.
1
@ SeaWarrior404, Sie haben Recht, aktualisierte meine Antwort mit es6-Syntax, fügte jsdoc und einige Interpunktionsbehandlung hinzu
disfated
214

Die kürzeste Implementierung zum Großschreiben von Wörtern innerhalb einer Zeichenfolge ist die folgende mit den Pfeilfunktionen von ES6:

'your string'.replace(/\b\w/g, l => l.toUpperCase())
// => 'Your String'

ES5-kompatible Implementierung:

'your string'.replace(/\b\w/g, function(l){ return l.toUpperCase() })
// => 'Your String'

Der reguläre Ausdruck entspricht im Wesentlichen dem ersten Buchstaben jedes Wortes innerhalb der angegebenen Zeichenfolge und wandelt nur diesen Buchstaben in Großbuchstaben um:

  • \ b entspricht einer Wortgrenze (Anfang oder Ende des Wortes);
  • \ w entspricht dem folgenden Metazeichen [a-zA-Z0-9].

Informationen zu Nicht-ASCII-Zeichen finden Sie stattdessen in dieser Lösung

'ÿöur striñg'.replace(/(^|\s)\S/g, l => l.toUpperCase())

Dieser reguläre Ausdruck entspricht dem ersten Buchstaben und jedem Nicht-Leerzeichen, dem ein Leerzeichen in der angegebenen Zeichenfolge vorangestellt ist, und wandelt nur diesen Buchstaben in Großbuchstaben um:

  • \ s entspricht einem Leerzeichen
  • \ S entspricht einem Nicht-Leerzeichen
  • (x | y) entspricht einer der angegebenen Alternativen

Eine nicht erfassende Gruppe hätte hier wie folgt verwendet werden können, /(?:^|\s)\S/gobwohl das gFlag in unserem regulären Ausdruck ohnehin keine Untergruppen beabsichtigt.

Prost!

Ivo
quelle
1
Können Sie in der Antwort erklären, wie der Regex funktioniert? (die Bedeutung jedes Stückes)
vsync
2
Ich werde es als Antwort auswählen, wenn die Erklärung darin enthalten ist und nicht als Kommentar, den man übersehen könnte.
vsync
2
Dies scheint für die nordischen Zeichen ä, ö und å nicht zu funktionieren. Zum Beispiel päijät-hämewirdPäIjäT-HäMe
Markus Meskanen
1
Diese Lösung eignet sich nicht für internationale Inhalte mit diakritischen / nicht-lateinischen Zeichen. EisbäRenist zum Beispiel ein Ergebnis.
Daniel B.
3
Das Beispiel von @MarkusMeskanen sollte sich in ändern Päijät-Häme, aber zumindest in Chrome enthält Whitespace nicht den Bindestrich (-), sodass der zweite Teil des Namens nicht groß geschrieben wird. Kann als behoben werden /(^|\s|-)\S/g.
MiRin
32
function capitalize(s){
    return s.toLowerCase().replace( /\b./g, function(a){ return a.toUpperCase(); } );
};

capitalize('this IS THE wOrst string eVeR');

Ausgabe: "Dies ist die schlechteste Zeichenfolge aller Zeiten"

Aktualisieren:

Es scheint, dass diese Lösung meine ersetzt: https://stackoverflow.com/a/7592235/104380

vsync
quelle
Achten Sie darauf, dass Ihre Funktion auch Buchstaben mit Akzent falsch großschreibt. Siehe meine Antwort: stackoverflow.com/questions/2332811/capitalize-words-in-string/… Ich habe es auch protoypiert.
Marco Demaio
9
Ich mag kein Prototyping, es kann zu Kollisionen führen, wenn jemand anderes den gleichen Namen auch für den Prototyp eines Strings verwendet.
vsync
15

Die Antwort von vsync funktioniert , solange Sie keine Buchstaben mit Akzent in der Eingabezeichenfolge haben.

Ich kenne den Grund nicht, aber anscheinend \bstimmen die in regulären Ausdrücken auch mit Akzentbuchstaben überein (getestet in IE8 und Chrome), sodass eine Zeichenfolge wie "località"falsch in"LocalitÀ"à Großbuchstaben umgewandelt wird (der Buchstabe wird großgeschrieben, weil der reguläre Ausdruck denkt, dass es sich um eine Wortgrenze handelt).

Eine allgemeinere Funktion, die auch mit Buchstaben mit Akzent funktioniert, ist diese:

String.prototype.toCapitalize = function()
{ 
   return this.toLowerCase().replace(/^.|\s\S/g, function(a) { return a.toUpperCase(); });
}

Sie können es so verwenden:

alert( "hello località".toCapitalize() );
Marco Demaio
quelle
1
" javascript".toCapitalize() -> " javascript"
disfated
2
Wen es betreffen könnte : Disfated Answer Stackoverflow.com/questions/2332811/capitalize-words-in-string/… ist jetzt die beste Antwort hier.
Marco Demaio
4

Da Ihnen jeder die von Ihnen angeforderte JavaScript-Antwort gegeben hat, werde ich darauf hinweisen, dass die CSS-Eigenschaft text-transform: capitalizegenau dies tut.

Mir ist klar, dass dies möglicherweise nicht das ist, wonach Sie fragen - Sie haben uns keinen Kontext angegeben, in dem Sie dies ausführen -, aber wenn es nur zur Präsentation dient, würde ich definitiv die CSS-Alternative wählen.

David Hedlund
quelle
KennyTM hat dich geschlagen. Überprüfen Sie seinen Kommentar im Fragenbereich. :-)
Buhake Sindi
Ja, ich kenne dieses CSS-Attribut, aber ich benötige es für das title-Attribut für dom-Elemente, und es hat, wie Sie vielleicht wissen, überhaupt kein CSS.
vsync
4

John Resig (von jQuery) portierte ein von John Gruber geschriebenes Perl-Skript nach JavaScript. Dieses Skript wird intelligenter großgeschrieben, es werden keine kleinen Wörter wie "von" und "und" großgeschrieben.

Sie finden es hier: Titel Großschreibung in JavaScript

meouw
quelle
4

Verwenden von JavaScript und HTML

String.prototype.capitalize = function() {
  return this.replace(/(^|\s)([a-z])/g, function(m, p1, p2) {
    return p1 + p2.toUpperCase();
  });
};
<form name="form1" method="post">
  <input name="instring" type="text" value="this is the text string" size="30">
  <input type="button" name="Capitalize" value="Capitalize >>" onclick="form1.outstring.value=form1.instring.value.capitalize();">
  <input name="outstring" type="text" value="" size="30">
</form>

Grundsätzlich können Sie dies tun string.capitalize()und es wird jeder erste Buchstabe jedes Wortes groß geschrieben.

Quelle: http://www.mediacollege.com/internet/javascript/text/case-capitalize.html

Buhake Sindi
quelle
1
Ich bin kein Fan von Prototypen auf diese Weise, da meine Skripte manchmal Einbettungen von Drittanbietern in andere Websites sind und dies zu Problemen mit globalen Objekten wie "String" führen kann. Deshalb ziehe ich es vor, sie stattdessen zu "fucntion".
vsync
1
Das ist das Schöne am Prototyp (nicht der Prototyp, den Sie herunterladen). Es ist Standard in Javascript und funktioniert in allen Browsern.
Buhake Sindi
Ich vermute, dass es Probleme verursachen kann, wenn jemand anderes bereits seinen eigenen String.prototype.capitalize prototypisiert hat, und ich werde ihn versehentlich überschreiben.
vsync
1
@vsync, Sie können dies jederzeit überprüfen. if (object.capitalize) {...} else {String.prototype.capitalize = function()....}wo Objekt vom Typ ist String. Es ist also ganz einfach.
Buhake Sindi
4

Ivos Antwort ist gut, aber ich ziehe es vor, nicht mitzuhalten, \wda 0-9 und AZ nicht groß geschrieben werden müssen. Wir können diese ignorieren und nur auf az übereinstimmen.

'your string'.replace(/\b[a-z]/g, match => match.toUpperCase())
// => 'Your String'

Es ist die gleiche Ausgabe, aber ich denke klarer in Bezug auf selbstdokumentierenden Code.

Großes Geld
quelle
Dies schlägt bei nicht englischen Buchstaben fehl : "Är Toaletten". Ihre Antwort, Jahre nachdem eine sehr gute Antwort gegeben wurde, trägt nicht zur Diskussion bei.
vsync
@vsync das scheint ziemlich hart. Es ist eine Optimierung der akzeptierten Antwort. /\b\w/gschlägt auch bei nicht englischen Buchstaben fehl. Nicht jeder befasst sich mit Unicode-Zeichen, und dies wird denjenigen helfen, die dies nicht wollen.
Big Money
1
Okay .. Ich denke nur nicht, dass Sie dies anstelle der Top-Antwort verwenden sollten, nur weil Sie außer Englisch keine anderen Sprachen benötigen. Das ist keine hinreichende Rechtfertigung, da es keine Strafe dafür gibt, dies für alle ASCII-Zeichen zu tun, wie in der obersten Frage angegeben
vsync
3

Wenn Sie lodash in Ihrer JavaScript-Anwendung verwenden, können Sie _.capitalize verwenden :

console.log( _.capitalize('ÿöur striñg') );
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.min.js"></script>

vicke4
quelle
3

Eine prägnante ES6-Methode könnte ungefähr so ​​aussehen.

const capitalizeFirstLetter = s => s.charAt(0).toUpperCase() + s.slice(1)

Dies setzt nur den ersten Buchstaben in Großbuchstaben und wirkt sich nicht auf den Rest des Satzes aus.

Otman Zaib
quelle
1

Dies sollte die meisten grundlegenden Anwendungsfälle abdecken.

const capitalize = (str) => {
    if (typeof str !== 'string') {
      throw Error('Feed me string')
    } else if (!str) {
      return ''
    } else {
      return str
        .split(' ')
        .map(s => {
            if (s.length == 1 ) {
                return s.toUpperCase()
            } else {
                const firstLetter = s.split('')[0].toUpperCase()
                const restOfStr = s.substr(1, s.length).toLowerCase()
                return firstLetter + restOfStr
            }     
        })
        .join(' ')
    }
}


capitalize('THIS IS A BOOK') // => This Is A Book
capitalize('this is a book') // => This Is A Book
capitalize('a 2nd 5 hour boOk thIs weEk') // => A 2nd 5 Hour Book This Week

Bearbeiten: Verbesserte Lesbarkeit der Zuordnung.

Tropfen
quelle
Können Sie bitte erklären, warum Ihre Antwort Ihrer Meinung nach besser ist als die anderer vor vielen Jahren?
vsync
Können Sie erklären, warum Sie dachten, dass meine Antwort die beste / oder die bessere ist als die anderer? Das habe ich nicht erwähnt, es ist einfach anders. Ich habe auch nicht gesehen, dass du diesen Kommentar in anderen Posts hinterlassen hast, also verstehe ich ihn wirklich nicht. Aber für den Anfang: Es verwendet moderne js-Funktionen (Destrukturierung, fetter Pfeil, implizite Rückgabe), es verwendet kein Regx und es ist eine funktionalere Herangehensweise an das Problem. Außerdem hat es eine sehr grundlegende Fehlerbehandlung und gibt eine leere Zeichenfolge zurück, wenn Sie eine übergeben (für mich war das wichtig).
Drops
Es ist in Ordnung, anders zu sein, aber es muss besser oder gleichwertig mit anderen Antworten sein, und es scheint ... unlesbar zu sein und sicherlich nichts, was man in den Produktionscode einfügen würde, weil niemand es verstehen könnte
vsync
Ahhh ok, also 50% der Lösungen hier, welche Monkeypatch-Saite werden Sie tatsächlich in Produktion bringen? Oder vielleicht verschlungene Regex-Ausdrücke? Das ist viel einfacher zu argumentieren, oder? Imho absolut nicht! Zu sagen, dass niemand dies verstehen wird, ist eine ziemlich subjektive Aussage. Auch dafür haben Sie gesagt, dass es sich um geschredderten Code handelt (mehr Funktionen, aber das ist hier nicht der Fall). Wie kann das geschreddert werden und meine Lösung wird niemand verstehen? Es gibt keine Möglichkeit, diese regulären Ausdrücke zu entwirren, ohne Stunden zu verlieren.
Drops
Dieser Code wurde von Herrn Resig selbst geschrieben und sollte nicht in Frage gestellt werden. Auf der anderen Seite fehlt Ihnen aufgrund Ihrer Anonymität die Glaubwürdigkeit. Unabhängig davon ist eine Regex-Lösung kürzer, läuft viel schneller und kann auch von jedem gelesen werden, der mit den Grundlagen von Regex vertraut ist. Es gibt kaum viel zu "entwirren": /\b\w/g...
vsync
1

Diese Lösung verwendet keinen regulären Ausdruck, unterstützt Zeichen mit Akzent und wird auch von fast jedem Browser unterstützt.

function capitalizeIt(str) {
    if (str && typeof(str) === "string") {
        str = str.split(" ");    
        for (var i = 0, x = str.length; i < x; i++) {
            if (str[i]) {
                str[i] = str[i][0].toUpperCase() + str[i].substr(1);
            }
        }
        return str.join(" ");
    } else {
        return str;
    }
}    

Verwendung:

console.log (capitalizeIt ('çao 2nd im Javascript-Programm'));

Ausgabe:

Çao 2nd Inside Javascript-Programm

Nabarag Paul
quelle
1
Auf diese Weise werden viele CPU-Ressourcen verbraucht. JavaScript ändert keine primitiven Werte. Dies bedeutet, dass bei jeder Operation eine neue erstellt wird. Es ist besser, native Funktionen wie "Ersetzen" zu verwenden, exempli gratia.
Daniel Bandeira
1

Meine Lösung:

String.prototype.toCapital = function () {
    return this.toLowerCase().split(' ').map(function (i) {
        if (i.length > 2) {
            return i.charAt(0).toUpperCase() + i.substr(1);
        }

        return i;
    }).join(' ');
};

Beispiel:

'álL riGht'.toCapital();
// Returns 'Áll Right'
Erick Tatsui
quelle
Probieren Sie verschiedene Methoden aus und Ihre Lösung ist die effizienteste und respektiert die Akzente des Namens jsbench.me/urjeu9wvql
nasatome
Dies funktioniert nicht: 'a áAA. bb . bbb .cc .d'.toCapital();=>a Áaa. bb . Bbb .cc .d
vsync
Ich habe es geschafft, Wörter mit weniger als 2 Buchstaben wie "von", "als" nicht zu berücksichtigen.
Erick Tatsui
0

http://www.mediacollege.com/internet/javascript/text/case-capitalize.html ist eine von vielen Antworten.

Google kann alles sein, was Sie für solche Probleme benötigen.

Ein naiver Ansatz wäre, die Zeichenfolge durch Leerzeichen zu teilen, den ersten Buchstaben jedes Elements des resultierenden Arrays in Großbuchstaben zu schreiben und wieder zusammenzufügen. Dies lässt die vorhandene Großschreibung in Ruhe (z. B. bleibt HTML HTML und wird nicht zu etwas Dummem wie HTML). Wenn Sie diesen Effekt nicht möchten, wandeln Sie die gesamte Zeichenfolge in Kleinbuchstaben um, bevor Sie sie aufteilen.

Alan Plum
quelle
0

Dieser Code schreibt Wörter nach Punkt groß:

function capitalizeAfterPeriod(input) { 
    var text = '';
    var str = $(input).val();
    text = convert(str.toLowerCase().split('. ')).join('. ');
    var textoFormatado = convert(text.split('.')).join('.');
    $(input).val(textoFormatado);
}

function convert(str) {
   for(var i = 0; i < str.length; i++){
      str[i] = str[i].split('');
      if (str[i][0] !== undefined) {
         str[i][0] = str[i][0].toUpperCase();
      }
      str[i] = str[i].join('');
   }
   return str;
}
Flavio
quelle
0

Ich mag es, mit einfachen Prozessen zu gehen. Ändern Sie zuerst die Zeichenfolge in Array, um das Iterieren zu vereinfachen, und ändern Sie dann mithilfe der Kartenfunktion jedes Wort so, wie Sie es möchten.

function capitalizeCase(str) {
    var arr = str.split(' ');
    var t;
    var newt;
    var newarr = arr.map(function(d){
        t = d.split('');
        newt = t.map(function(d, i){
                  if(i === 0) {
                     return d.toUpperCase();
                    }
                 return d.toLowerCase();
               });
        return newt.join('');
      });
    var s = newarr.join(' ');
    return s;
  }
Mritunjay Upadhyay
quelle
0

Jquery oder Javascipt bieten keine integrierte Methode, um dies zu erreichen.

Die CSS-Testtransformation (Texttransformation: großschreiben;) aktiviert die Daten der Zeichenfolge nicht wirklich, zeigt jedoch ein großgeschriebenes Rendering auf dem Bildschirm an.

Wenn Sie nach einer legitimeren Möglichkeit suchen, dies auf Datenebene mit einfachem VanillaJS zu erreichen, verwenden Sie diese Lösung =>

var capitalizeString = function (word) {    
    word = word.toLowerCase();
    if (word.indexOf(" ") != -1) { // passed param contains 1 + words
        word = word.replace(/\s/g, "--");
        var result = $.camelCase("-" + word);
        return result.replace(/-/g, " ");
    } else {
    return $.camelCase("-" + word);
    }
}
siwalikm
quelle
0

Benutze das:

String.prototype.toTitleCase = function() {
  return this.charAt(0).toUpperCase() + this.slice(1);
}

let str = 'text';
document.querySelector('#demo').innerText = str.toTitleCase();
<div class = "app">
  <p id = "demo"></p>
</div>

Sanjay
quelle
0

Sie können Folgendes verwenden, um Wörter in einer Zeichenfolge groß zu schreiben:

function capitalizeAll(str){

    var partes = str.split(' ');

    var nuevoStr = ""; 

    for(i=0; i<partes.length; i++){
    nuevoStr += " "+partes[i].toLowerCase().replace(/\b\w/g, l => l.toUpperCase()).trim(); 
    }    

    return nuevoStr;

}
Marcos Torres
quelle
0

Es gibt auch locutus: https://locutus.io/php/strings/ucwords/, der es so definiert:

function ucwords(str) {
  //  discuss at: http://locutus.io/php/ucwords/
  // original by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
  // improved by: Waldo Malqui Silva (http://waldo.malqui.info)
  // improved by: Robin
  // improved by: Kevin van Zonneveld (http://kvz.io)
  // bugfixed by: Onno Marsman (https://twitter.com/onnomarsman)
  // bugfixed by: Cetvertacov Alexandr (https://github.com/cetver)
  //    input by: James (http://www.james-bell.co.uk/)
  //   example 1: ucwords('kevin van  zonneveld')
  //   returns 1: 'Kevin Van  Zonneveld'
  //   example 2: ucwords('HELLO WORLD')
  //   returns 2: 'HELLO WORLD'
  //   example 3: ucwords('у мэри был маленький ягненок и она его очень любила')
  //   returns 3: 'У Мэри Был Маленький Ягненок И Она Его Очень Любила'
  //   example 4: ucwords('τάχιστη αλώπηξ βαφής ψημένη γη, δρασκελίζει υπέρ νωθρού κυνός')
  //   returns 4: 'Τάχιστη Αλώπηξ Βαφής Ψημένη Γη, Δρασκελίζει Υπέρ Νωθρού Κυνός'

  return (str + '').replace(/^(.)|\s+(.)/g, function ($1) {
    return $1.toUpperCase();
  });
};
geoidesic
quelle
0

Ich würde Regex für diesen Zweck verwenden:

myString = '  this Is my sTring.  ';
myString.trim().toLowerCase().replace(/\w\S*/g, (w) => (w.replace(/^\w/, (c) => c.toUpperCase())));
Bildunterschrift Newt
quelle