Insira um espaço antes das letras maiúsculas

95

Eu tenho uma corda "MySites". Eu quero colocar um espaço entre Mye Sites.

Como posso fazer isso em jQuery ou JavaScript?

CLiown
fonte
1
Você pode fornecer mais alguns detalhes? Qual é a forma geral das strings que você deseja separar? Se for apenas aquela string, por que não colocar o espaço manualmente?
Pointy,
2
Por favor, seja mais preciso, acho que ninguém consegue entender o que você está perguntando
Clement Herreman,
1
defina o padrão que deve corresponder, por exemplo, "um espaço quando encontrar 'Meu' na string" ou "adicione um espaço antes de cada caractere maiúsculo, a menos que seja o primeiro caractere", ou ....
JohnSmith
"entre MySites". Como você pode colocar um espaço entre 1 coisa? Presumo que você queira "Meus Sites" como saída.
Rocket Hazmat
#meagar - bom comentário (sarcasmo). você nunca foi ensinado que se não tiver nada de bom para dizer, não diga nada?
carinlynchin de

Respostas:

163

Você pode simplesmente adicionar um espaço antes de cada caractere maiúsculo e cortar os espaços à esquerda e à direita

s = s.replace(/([A-Z])/g, ' $1').trim()
user2051552
fonte
Isso também funciona para "1AndAbove". A outra solução não. Obrigado!!
desaivv
1
Ele "falha" para siglas, como poderíamos evitar que ele atue quando 2 ou mais maiúsculas consecutivas?
Toni Michel Caubet
3
@ToniMichelCaubet fácil, modificar o regex assim: /([A-Z]+)/g. O + fará com que você combine o maior número possível de letras maiúsculas consecutivas.
iFreilicht
Por que os parênteses que você usa para envolver '[AZ]' são necessários neste código?
Kristina Bressler
@Kristina O parêntese diz 'Eu sou uma variável'. Sem o parêntese, ele retorna a resposta '$ 1y $ 1ites' para '
MySites
127

Isso encontrará cada ocorrência de um caractere minúsculo seguido por um caractere maiúsculo e inserirá um espaço entre eles:

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

Para casos especiais quando ocorrem 2 letras maiúsculas consecutivas (Ex: ThisIsATest), adicione o código adicional abaixo:

 s = s.replace(/([A-Z])([A-Z])/g, '$1 $2');
Guffa
fonte
3
Apenas um aviso, isso falha para letras únicas "ThisIsATest" resultará em "This Is ATest".
Ceres
3
@Ceres: Bom ponto. Esse caso pode ser tratado inserindo um espaço antes de qualquer maiúscula que não seja o primeiro caractere, mas você ainda tem casos que não podem ser tratados sem o reconhecimento de palavras, como "RunThisSQLQuery".
Guffa
1
para "ThisIsATest" - (sem contar o 'RunThisSQLQuery'), você poderia fazer isso: str.replace (/ ([AZ]) / g, '$ 1'). trim ()
carinlynchin
Brilhante! Obrigado!
Ami Schreiber
21

Posso sugerir uma pequena edição na resposta atualmente aceita:

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

Isso significa que:

ACROText -> ACRO Text
UserNameTest -> User Name Test

O que pode ser um pouco mais útil se você estiver lidando com nomes de coluna db (e estiver usando acrônimos para algumas coisas)

JosephGarrone
fonte
1
Isso funciona perfeitamente para o que eu estava precisando. Adicionava perfeitamente um espaço entre as letras maiúsculas, mas mantinha as siglas juntas.
mighty_mite
6

Isso deve inserir um espaço entre cada letra maiúscula que não foi precedida por uma letra maiúscula.

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

newStringterá o valor que você deseja. Além disso, se quiser encurtar seu código usando regex, você pode usar o seguinte código de Javascript camelCase para o formato regular

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

regex para encontrar minúsculas - limite de maiúsculas e inserir um espaço

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

http://jsfiddle.net/uXy64/

Adam Straughan
fonte
2

Aqui está o que acabei usando para converter uma string em uma caixa de título, com base em algumas das respostas aqui:

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

Aqui está um JSFiddle onde você pode testar sua string para ver se ela atende às suas necessidades: https://jsfiddle.net/thomastasa/5236dv8t/85/


Exemplos:

  • "yourStringHere" -> "Your String Here"
  • "AnotherStringHere" -> "Outra String Aqui"
  • "someones_string" -> "String de Alguém"
  • "Outra String-Aqui" -> "Outra String Aqui"
  • "myAWESOMEString" -> "My AWESOME String"
Thomas Stein
fonte
1

Você pode usar String#split()e um look-ahead para o alfabeto em maiúsculas ( [A-Z]) e Array#join()a matriz com um espaço:

let stringCamelCase = "MySites";

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

console.log(string)

Ou, como uma função String Object:

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

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

Luca Kiebel
fonte
1

Em uma única regex substituir (sem cortes ou junções) que permite qualquer caractere, não apenas letras [a-z]ou [A-Z].

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

Você pode verificar mais sobre o look behind (?<!^) aqui .

José da Silva
fonte