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?


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

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

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)


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


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"

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());


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 .

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.