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
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:
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(); })
Odpowiedzi:
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()
źródło
/([A-Z]+)/g
. Znak + sprawi, że dopasujesz jak najwięcej kolejnych wielkich liter.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');
źródło
"RunThisSQLQuery"
.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:
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)
źródło
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]; }
newString
bę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(); })
źródło
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/
źródło
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:
źródło
Możesz użyć
String#split()
i wyprzedzenia dla alfabetu pisanego wielkimi literami ([A-Z]
), a następnieArray#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());
źródło
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 .źródło