Büyük harflerden önce boşluk ekle


100

Bir ipim var "MySites". Ben arasına boşluk yerleştirmek istediğiniz Myve Sites.

Bunu jQuery veya JavaScript'te nasıl yapabilirim?


1
Biraz daha detay verebilir misin? Ayırmak istediğiniz dizelerin genel biçimi nedir? Yalnızca tek bir dizeyse, neden boşluğu manuel olarak yerleştirmiyorsunuz?
Sivri

2
Lütfen daha kesin olun, kimsenin ne sorduğunuzu anlayabileceğini sanmıyorum
Clement Herreman

1
Eşleşmesi gereken kalıbı tanımlayın, örneğin "dizede 'My' bulduğunda bir boşluk" veya "ilk karakter olmadığı sürece her büyük karakterden önce bir boşluk ekle" veya ....
JohnSmith

"Sitelerim arasında". 1 şey arasına nasıl boşluk bırakabilirsiniz? Çıktı olarak "Sitelerim" i istediğinizi varsayıyorum.
Rocket Hazmat

#meagar - güzel yorum (alay). Söyleyecek güzel bir şeyin yoksa hiçbir şey söylemeyeceğini hiç öğretmedin mi?
carinlynchin

Yanıtlar:


180

Her büyük harften önce bir boşluk ekleyebilir ve baştaki ve sondaki boşlukları kırpabilirsiniz.

s = s.replace(/([A-Z])/g, ' $1').trim()

Bu aynı zamanda "1AndAbove" için de çalışır. Diğer çözüm yok. Teşekkürler!!
One-One

1
Kısaltmalar için "başarısız" oluyor, 2 veya daha fazla ardışık büyük harf olduğunda hareket etmesini nasıl engelleyebiliriz?
Toni Michel Caubet

4
Böyle regex değiştirmek kolay @ToniMichelCaubet: /([A-Z]+)/g. +, Mümkün olduğunca çok sayıda ardışık büyük harfle eşleşmenizi sağlar.
iFreilicht

Bu kodda '[AZ]' yi çevrelemek için kullandığınız parantezler neden gerekli?
Kristina Bressler

1
@Kristina Parantez 'Ben bir değişkenim' diyor. Parantez olmadan, 'MySites' için '$ 1y $ 1ites' yanıtını verir
user2051552

128

Bu, her bir küçük harfli karakteri ve ardından bir büyük harf karakterini bulur ve aralarına bir boşluk ekler:

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

Ardışık 2 büyük harfin olduğu özel durumlar için (Örn: ThisIsATest) aşağıya ek kod ekleyin:

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

3
Sadece bir uyarı, bu tek harf için başarısız olur "ThisIsATest", "This Is ATest" ile sonuçlanır.
Ceres

3
@Ceres: İyi nokta. Bu durum, herhangi bir büyük harften önce ilk karakter olmayan bir boşluk ekleyerek ele alınabilir, ancak yine de kelime tanıma olmadan ele alınamayan durumlarınız var "RunThisSQLQuery".
Guffa

1
"ThisIsATest" için - ('RunThisSQLQuery'yi saymadan) bunu yapabilirsiniz: str.replace (/ ([AZ]) / g,' $ 1 '). trim ()
carinlynchin

Parlak! Teşekkürler!
Ami Schreiber

24

Şu anda kabul edilen cevaba ufak bir değişiklik önerebilir miyim:

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

Bu şu demek:

ACROText -> ACRO Text
UserNameTest -> User Name Test

Eğer db sütun isimleriyle uğraşıyorsanız biraz daha kullanışlı olabilir (ve bazı şeyler için kısaltmalar kullanıyorsanız)


1
Bu, ihtiyacım olan şey için mükemmel çalışıyor. Büyük harfler arasına mükemmel bir boşluk ekledi ancak kısaltmaları bir arada tuttu.
mighty_mite

6

Bu, her büyük harf arasına bir büyük harf gelmeyen bir boşluk eklemelidir.

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

newStringistediğiniz değere sahip olacak. Ayrıca, regex kullanarak kodunuzu kısaltmak istiyorsanız, aşağıdaki kodu Javascript camelCase'den Normal Form'a kullanabilirsiniz.

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


4

İşte buradaki cevaplardan birkaçına dayanarak bir dizeyi başlık durumuna dönüştürmek için kullandığım şey:

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

İhtiyaçlarınızı karşılayıp karşılamadığını görmek için dizenizi test edebileceğiniz bir JSFiddle: https://jsfiddle.net/thomastasa/5236dv8t/85/


Örnekler:

  • "yourStringHere" -> "Dizeniz Burada"
  • "AnotherStringHere" -> "Başka Bir Dize Burada"
  • "someones_string" -> "Biri Dizesi"
  • "Başka-Dize-Burada" -> "Burada Başka Bir Dize"
  • "myAWESOMEString" -> "MUHTEŞEM DİZEM"

1

Büyük String#split()harfli alfabe ( [A-Z]) ve ardından Array#join()boşluk içeren dizi için ve ileriye bakabilirsiniz :

let stringCamelCase = "MySites";

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

console.log(string)

Veya bir Dize Nesnesi işlevi olarak:

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

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


1

Tek bir regex herhangi bir karakter değil, sadece harfler izin verdiğini (düzeltir olmadan veya birleşimler) değiştirin [a-z]ya [A-Z].

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

(?<!^) Buradaki bakış hakkında daha fazla bilgi edinebilirsiniz .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.