2011-04-07 24 views
52

Tengo una cadena "MySites". Quiero colocar un espacio entre My y Sites.Insertar espacio antes de mayúsculas

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

+1

¿Puede dar un poco más de detalle? ¿Cuál es la forma general de las cadenas que desea separar? Si solo se trata de una cadena, ¿por qué no pone el espacio manualmente? – Pointy

+2

Sea más preciso, no creo que nadie pueda entender lo que está preguntando –

+1

defina el patrón que debe coincidir, p. Ej. "un espacio cuando encuentre 'Mi' en la cadena" o "agregue un espacio antes de cada carácter capital, a menos que sea el primer carácter", o .... – JohnSmith

Respuesta

66

Usted puede añadir 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() 
+0

Esto también funciona para "1AndAbove". La otra solución no. ¡¡Gracias!! –

+0

"falla" para acrónimos, ¿cómo podríamos evitar que actúe cuando 2 o más tapas consecutivas? –

+0

@ToniMichelCaubet fácil, modifique la expresión regular de la siguiente manera: '/ ([A-Z] +)/g'. El + se asegurará de que coincidan tantas mayúsculas consecutivas como sea posible. – iFreilicht

5

Esto debe insertar un espacio entre cada letra mayúscula que no fue precedida 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]; 
} 

newString tendrá el valor que desee. Además, si desea acortar el código utilizando expresiones regulares, puede utilizar el siguiente código de Javascript camelCase to Regular Form

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

Este encontrarán cada ocurrencia de un carácter en minúscula seguida de un carácter en mayúsculas, e insertar un espacio entre ellas :

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

Para casos especiales cuando 2 letras mayúsculas consecutivas ocurren (Ej: ThisIsATest) añadir código adicional a continuación:

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

Solo una advertencia, esto falla para letras simples "ThisIsATest" resultará "This Is ATest". – Ceres

+3

@Ceres: Buen punto. Ese caso podría manejarse insertando un espacio antes de cualquier capital 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') puede hacer esto: str.replace (/ ([A-Z])/g, '$ 1'). Trim() – carinlynchin

2

expresión regular para encontrar minúsculas - caso límite superior y luego insertar un espacio

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

http://jsfiddle.net/uXy64/

9

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 columna db (Y está utilizando acrónimos para algunas cosas)

+0

Esto funciona perfectamente para lo que estaba necesitando. Se agregó perfectamente un espacio entre letras mayúsculas, pero mantuvo acrónimos juntos. –

Cuestiones relacionadas