Fügen Sie vor Großbuchstaben ein Leerzeichen ein

95

Ich habe eine Schnur "MySites". Ich möchte ein Leerzeichen zwischen Myund setzen Sites.

Wie kann ich das in jQuery oder JavaScript machen?

CLiown
quelle
1
Können Sie weitere Einzelheiten mitteilen? Was ist die allgemeine Form der Zeichenfolgen, die Sie trennen möchten? Wenn es nur diese eine Zeichenfolge ist, warum nicht einfach das Leerzeichen manuell eingeben?
Pointy
2
Bitte seien Sie genauer, ich glaube nicht, dass jemand verstehen kann, was Sie fragen
Clement Herreman
1
Definieren Sie das Muster, mit dem es übereinstimmen soll, z. B. "ein Leerzeichen, wenn 'My' in der Zeichenfolge gefunden wird" oder "
Fügen
"zwischen MySites". Wie können Sie ein Leerzeichen zwischen 1 Sache platzieren? Ich gehe davon aus, dass Sie "Meine Websites" als Ausgabe möchten.
Rocket Hazmat
#meagar - netter Kommentar (Sarkasmus). Wurde Ihnen nie beigebracht, dass Sie, wenn Sie nichts Nettes zu sagen haben, überhaupt nichts sagen?
Carinlynchin

Antworten:

162

Sie können einfach vor jedem Großbuchstaben ein Leerzeichen einfügen und die führenden und nachfolgenden Leerzeichen abschneiden

s = s.replace(/([A-Z])/g, ' $1').trim()
user2051552
quelle
Dies funktioniert auch für "1AndAbove". Die andere Lösung nicht. Vielen Dank!!
Desaivv
1
Es "scheitert" bei Akronymen. Wie können wir verhindern, dass es bei zwei oder mehr aufeinander folgenden Kappen wirkt?
Toni Michel Caubet
3
@ToniMichelCaubet einfach, ändern Sie die Regex wie folgt : /([A-Z]+)/g. Das + stellt sicher, dass Sie so viele aufeinanderfolgende Großbuchstaben wie möglich finden.
iFreilicht
Warum werden in diesem Code Klammern benötigt, mit denen Sie '[AZ]' umgeben?
Kristina Bressler
@Kristina In der Klammer steht "Ich bin eine Variable". Ohne die Klammer ergibt sich die Antwort '$ 1y $ 1ites' für 'MySites'
user2051552
127

Dadurch wird jedes Vorkommen eines Kleinbuchstaben gefolgt von einem Großbuchstaben gefunden und ein Leerzeichen dazwischen eingefügt:

s = s.replace(/([a-z])([A-Z])/g, '$1 $2');

In besonderen Fällen, in denen 2 aufeinanderfolgende Großbuchstaben auftreten (z. B. ThisIsATest), fügen Sie unten zusätzlichen Code hinzu:

 s = s.replace(/([A-Z])([A-Z])/g, '$1 $2');
Guffa
quelle
3
Nur eine Warnung, dies schlägt für einzelne Buchstaben fehl. "ThisIsATest" führt zu "This Is ATest".
Ceres
3
@ Ceres: Guter Punkt. Dieser Fall könnte behandelt werden, indem stattdessen ein Leerzeichen vor einem Großbuchstaben eingefügt wird, das nicht das erste Zeichen ist. Sie haben jedoch immer noch Fälle, die ohne Worterkennung nicht behandelt werden können, z "RunThisSQLQuery".
Guffa
1
Für den "ThisIsATest" - (ohne 'RunThisSQLQuery') können Sie dies tun: str.replace (/ ([AZ]) / g, '$ 1'). trim ()
carinlynchin
Brillant! Vielen Dank!
Ami Schreiber
21

Darf ich eine geringfügige Änderung der aktuell akzeptierten Antwort vorschlagen:

function insertSpaces(string) {
    string = string.replace(/([a-z])([A-Z])/g, '$1 $2');
    string = string.replace(/([A-Z])([A-Z][a-z])/g, '$1 $2')
    return string;
}

Dies bedeutet, dass:

ACROText -> ACRO Text
UserNameTest -> User Name Test

Was möglicherweise etwas nützlicher ist, wenn Sie sich mit DB-Spaltennamen befassen (und für einige Dinge Akronyme verwenden).

Joseph Garrone
quelle
1
Dies funktioniert perfekt für das, was ich brauchte. Es fügte perfekt ein Leerzeichen zwischen Großbuchstaben hinzu, hielt aber die Akronyme zusammen.
mächtiger_Mite
6

Dies sollte ein Leerzeichen zwischen jedem Großbuchstaben einfügen, dem kein Großbuchstabe vorangestellt wurde.

var myString = "MySites"
var newString = "";
var wasUpper = false;
for (var i = 0; i < myString.length; i++)
{
    if (!wasUpper && myString[i] == myString.toUpperCase()[i])
    {
        newString = newString + " ";
        wasUpper = true;
    }
    else
    {
        wasUpper = false;
    }
    newString = newString + myString[i];
}

newStringwird den Wert haben, den Sie wollen. Wenn Sie Ihren Code mit Regex kürzen möchten, können Sie den folgenden Code von Javascript camelCase bis Regular Form verwenden

"thisStringIsGood"
    // insert a space before all caps
    .replace(/([A-Z])/g, ' $1')
    // uppercase the first character
    .replace(/^./, function(str){ return str.toUpperCase(); })
Devin Burke
quelle
5

Regex, um die Grenze zwischen Kleinbuchstaben und Großbuchstaben zu finden, und fügen Sie dann ein Leerzeichen ein

<div id='x'>ThisIsMySites</div>
$('#x').text( $('#x').text().replace(/([a-z])([A-Z])/g, "$1 $2") );

http://jsfiddle.net/uXy64/

Adam Straughan
quelle
2

Folgendes habe ich letztendlich verwendet, um eine Zeichenfolge in einen Titel zu konvertieren, basierend auf einigen der Antworten hier:

str = str
  .replace(/(_|-)/g, ' ')
  .trim()
  .replace(/\w\S*/g, function(str) {
    return str.charAt(0).toUpperCase() + str.substr(1)
  })   
  .replace(/([a-z])([A-Z])/g, '$1 $2')
  .replace(/([A-Z])([A-Z][a-z])/g, '$1 $2')   

Hier ist eine JSFiddle, in der Sie Ihre Zeichenfolge testen können, um festzustellen, ob diese Ihren Anforderungen entspricht: https://jsfiddle.net/thomastasa/5236dv8t/85/


Beispiele:

  • "yourStringHere" -> "Your String Here"
  • "AnotherStringHere" -> "Another String Here"
  • "someones_string" -> "Someones String"
  • "Another-String-Here" -> "Another String Here"
  • "myAWESOMEString" -> "My AWESOME String"
Thomas Stein
quelle
1

Sie können String#split()das großgeschriebene Alphabet ( [A-Z]) und dann Array#join()das Array mit einem Leerzeichen verwenden und vorausschauen:

let stringCamelCase = "MySites";

let string = stringCamelCase.split(/(?=[A-Z])/).join(" ");

console.log(string)

Oder als String-Objekt-Funktion:

String.prototype.cC2SC = function() {
  return this.split(/(?=[A-Z])/).join(" ");
}

console.log("MyCamelCase".cC2SC());

Luca Kiebel
quelle
1

Ersetzen Sie in einem einzelnen regulären Ausdruck (ohne Verzierungen oder Verknüpfungen) jedes Zeichen, nicht nur Buchstaben [a-z]oder [A-Z].

const str = "MySites";
str.replace(/(?<!^)([A-Z])/, " $1"); // -> "My Sites"

Hier können Sie mehr über den Blick dahinter (?<!^) erfahren .

Jose Da Silva
quelle