Wstaw spację przed dużymi literami

98

Mam sznurek "MySites". Chcę wstawić spację między Mya Sites.

Jak mogę to zrobić w jQuery lub JavaScript?

CLiown
źródło
1
Czy możesz podać więcej szczegółów? Jaka jest ogólna forma strun, które chcesz rozdzielić? Jeśli to tylko ten jeden ciąg, dlaczego nie wstawić spacji ręcznie?
Pointy
2
Proszę być bardziej precyzyjnym, nie sądzę, aby ktokolwiek mógł zrozumieć, o co pytasz
Clement Herreman,
1
zdefiniuj wzorzec, który ma pasować, np. "spacja, gdy znajdzie 'My' w ciągu" lub "dodaj spację przed każdą wielką
literą
„między MySites”. Jak możesz umieścić odstęp między jedną rzeczą? Zakładam, że chcesz, aby jako wynik był „Moje witryny”.
Rocket Hazmat
#meagar - miły komentarz (sarkazm). Czy nigdy nie uczono cię, że jeśli nie masz nic miłego do powiedzenia, to w ogóle nic nie mów?
carinlynchin

Odpowiedzi:

173

Możesz po prostu dodać spację przed każdą wielką literą i odciąć spacje wiodące i końcowe

s = s.replace(/([A-Z])/g, ' $1').trim()
user2051552
źródło
Działa to również dla „1AndAbove”. Drugie rozwiązanie nie. Dzięki!!
One-One
1
„Zawodzi” w przypadku akronimów, jak możemy zapobiec jego działaniu, gdy 2 lub więcej następujących po sobie wielkich liter?
Toni Michel Caubet
4
@ToniMichelCaubet łatwe modyfikowanie regex tak: /([A-Z]+)/g. Znak + sprawi, że dopasujesz jak najwięcej kolejnych wielkich liter.
iFreilicht
Dlaczego w tym kodzie potrzebne są nawiasy, których używasz do otaczania znaku „[AZ]”?
Kristina Bressler
1
@Kristina W nawiasach napisano „Jestem zmienną”. Bez nawiasów daje odpowiedź „$ 1y $ 1ites” dla „MySites”
user2051552
128

Spowoduje to znalezienie każdego wystąpienia małej litery, po której następuje duża litera, i wstawienie spacji między nimi:

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

W szczególnych przypadkach, gdy występują 2 kolejne wielkie litery (np. ThisIsATest), dodaj dodatkowy kod poniżej:

 s = s.replace(/([A-Z])([A-Z])/g, '$1 $2');
Guffa
źródło
3
Tylko ostrzeżenie, to się nie powiedzie dla pojedynczych liter „ThisIsATest” da wynik „This Is ATest”.
Ceres
3
@Ceres: Słuszna uwaga. Ten przypadek można by obsłużyć, wstawiając spację przed każdą wielką literą, która nie jest pierwszym znakiem, ale nadal istnieją przypadki, których nie można obsłużyć bez rozpoznawania słów, na przykład "RunThisSQLQuery".
Guffa
1
dla „ThisIsATest” - (nie licząc „RunThisSQLQuery”) można to zrobić: str.replace (/ ([AZ]) / g, '$ 1'). trim ()
carinlynchin
Znakomity! Dzięki!
Ami Schreiber,
22

Czy mogę zasugerować niewielką zmianę obecnie zaakceptowanej odpowiedzi:

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;
}

To znaczy że:

ACROText -> ACRO Text
UserNameTest -> User Name Test

Co może być nieco bardziej przydatne, jeśli masz do czynienia z nazwami kolumn db (i używasz akronimów do niektórych rzeczy)

JosephGarrone
źródło
1
Działa to idealnie w przypadku tego, czego potrzebowałem. Doskonale dodawał spację między dużymi literami, ale zachowywał razem akronimy.
mighty_mite,
6

Powinno to spowodować wstawienie spacji między każdą wielką literą, która nie była poprzedzona dużą literą.

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];
}

newStringbędzie miał wartość, którą chcesz. Ponadto, jeśli chcesz skrócić swój kod za pomocą wyrażenia regularnego, możesz użyć następującego kodu z Javascript camelCase do Regular Form

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

regex, aby znaleźć małą literę - górną granicę, a następnie wstaw spację

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

http://jsfiddle.net/uXy64/

Adam Straughan
źródło
3

Oto, czego ostatecznie użyłem, aby przekonwertować ciąg na przypadek tytułu, na podstawie kilku odpowiedzi tutaj:

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')   

Oto JSFiddle, w którym możesz przetestować swój ciąg, aby sprawdzić, czy spełnia on Twoje potrzeby: https://jsfiddle.net/thomastasa/5236dv8t/85/


Przykłady:

  • "yourStringHere" -> "Tutaj twój ciąg"
  • „AnotherStringHere” -> „Another String Here”
  • "someones_string" -> "Someones String"
  • „Another-String-Here” -> „Another-String Here”
  • "myAWESOMEString" -> "My AWESOME String"
Thomas Stein
źródło
1

Możesz użyć String#split()i wyprzedzenia dla alfabetu pisanego wielkimi literami ( [A-Z]), a następnie Array#join()tablicy ze spacją:

let stringCamelCase = "MySites";

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

console.log(string)

Lub jako funkcja obiektu typu String:

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

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

Luca Kiebel
źródło
1

W pojedynczej zamianie wyrażenia regularnego (bez przycinania i łączenia), która dopuszcza dowolny znak, a nie tylko litery [a-z]lub [A-Z].

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

Więcej informacji na temat wyglądu z tyłu można znaleźć (?<!^) tutaj .

Jose Da Silva
źródło