Insertar espacio antes de las letras mayúsculas

96

Tengo una cuerda "MySites". Quiero colocar un espacio entre Myy Sites.

¿Cómo puedo hacer esto en jQuery o JavaScript?

CLiown
fuente
1
¿Puede darnos más detalles? ¿Cuál es la forma general de las cadenas que desea separar? Si es solo esa cadena, ¿por qué no poner el espacio manualmente?
Puntiagudo
2
Por favor, sea más preciso, no creo que nadie pueda entender lo que está preguntando
Clement Herreman
1
defina el patrón que debe coincidir, por ejemplo, "un espacio cuando encuentre 'Mi' en la cadena" o "agregue un espacio antes de cada carácter en mayúscula, a menos que sea el primer carácter", o ....
JohnSmith
"entre MySites". ¿Cómo se puede colocar un espacio entre 1 cosa? Supongo que desea "Mis sitios" como resultado.
Rocket Hazmat
#meagar - bonito comentario (sarcasmo). ¿Nunca te enseñaron que si no tienes nada bueno que decir, no digas nada en absoluto?
carinlynchin

Respuestas:

167

Puede simplemente agregar un espacio antes de cada carácter en mayúscula y recortar los espacios iniciales y finales

s = s.replace(/([A-Z])/g, ' $1').trim()
usuario2051552
fuente
Esto también funciona para "1AndAbove". La otra solución no lo hace. ¡¡Gracias!!
desaivv
1
"Falla" por acrónimos, ¿cómo evitar que actúe cuando 2 o más mayúsculas consecutivas?
Toni Michel Caubet
4
@ToniMichelCaubet fácil, modificar la expresión regular como esto: /([A-Z]+)/g. El + asegurará que coincida con tantas letras mayúsculas consecutivas como sea posible.
iFreilicht
¿Por qué se necesitan los paréntesis que utiliza para rodear '[AZ]' en este código?
Kristina Bressler
1
@Kristina El paréntesis dice 'Soy una variable'. Sin el paréntesis, se produce la respuesta '$ 1a $ 1ites' para '' MySites
user2051552
128

Esto encontrará cada aparición de un carácter en minúscula seguido de un carácter en mayúscula e insertará un espacio entre ellos:

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

Para casos especiales cuando aparecen 2 letras mayúsculas consecutivas (por ejemplo: ThisIsATest), agregue código adicional a continuación:

 s = s.replace(/([A-Z])([A-Z])/g, '$1 $2');
Guffa
fuente
3
Solo una advertencia, esto falla para letras simples "ThisIsATest" dará como resultado "This Is ATest".
Ceres
3
@Ceres: Buen punto. Ese caso podría manejarse insertando un espacio antes de cualquier mayúscula que no sea el primer carácter, pero aún tiene casos que no se pueden manejar sin reconocimiento de palabras, como "RunThisSQLQuery".
Guffa
1
para "ThisIsATest" - (sin contar el 'RunThisSQLQuery') puedes hacer esto: str.replace (/ ([AZ]) / g, '$ 1'). trim ()
carinlynchin
¡Brillante! ¡Gracias!
Ami Schreiber
21

¿Puedo sugerir una ligera modificación a la respuesta actualmente aceptada:

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

Esto significa que:

ACROText -> ACRO Text
UserNameTest -> User Name Test

Lo que podría ser un poco más útil si se trata de nombres de columnas de base de datos (y utiliza siglas para algunas cosas)

JosephGarrone
fuente
1
Esto funciona perfectamente para lo que necesitaba. Agregó perfectamente un espacio entre letras mayúsculas pero mantuvo los acrónimos juntos.
mighty_mite
6

Esto debe insertar un espacio entre cada letra mayúscula que no esté precedido por una letra mayú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];
}

newStringtendrá el valor que desee. Además, si desea acortar su código usando expresiones regulares, puede usar el siguiente código de Javascript camelCase a 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
fuente
5

regex para encontrar minúsculas - límite de mayúsculas y luego inserte un espacio

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

http://jsfiddle.net/uXy64/

Adam Straughan
fuente
2

Esto es lo que terminé usando para convertir una cadena en un caso de título, según algunas de las respuestas aquí:

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

Aquí hay un JSFiddle donde puede probar su cadena para ver si satisface sus necesidades: https://jsfiddle.net/thomastasa/5236dv8t/85/


Ejemplos:

  • "yourStringHere" -> "Your String Here"
  • "AnotherStringHere" -> "Otra cadena aquí"
  • "someones_string" -> "Someones String"
  • "Otra-cadena-aquí" -> "Otra cadena aquí"
  • "myAWESOMEString" -> "Mi cadena IMPRESIONANTE"
Thomas Stein
fuente
1

Puede usar String#split()y un avance para el alfabeto en mayúscula ( [A-Z]) y luego Array#join()la matriz con un espacio:

let stringCamelCase = "MySites";

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

console.log(string)

O, como una función de objeto de cadena:

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

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

Luca Kiebel
fuente
1

En una sola expresión regular, reemplace (sin recortes ni uniones) que permite cualquier carácter, no solo letras [a-z]o [A-Z].

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

Puede consultar más sobre la mirada hacia atrás (?<!^) aquí .

Jose Da Silva
fuente