2011-02-03 22 views
18

Cómo encubrir "HelloWorld" a "Hello World". La división tiene que realizarse según las mayúsculas, pero debe excluir la primera letra.Insertar espacio después de mayúscula

P.S: Soy consciente de usar String.split y luego combinar. Solo quería saber si hay una manera mejor.

+0

envíos como un comentario en lugar de respuesta porque no sé la sintaxis Pero estoy seguro de que sería muy fácil escribir una expresión regular que buscaría una letra mayúscula (que no está al principio de la oración) y agregar un espacio antes. – DaveJohnston

+1

¿Espera 'convert (" HELLO ") ==" H E L L O "'? – vz0

+0

@ vz0: En realidad, mi cuerda tendrá una minúscula entre las mayúsculas. – Emil

Respuesta

57
String output = input.replaceAll("(\\p{Ll})(\\p{Lu})","$1 $2"); 

Este regex busca una letra minúscula follwed por una letra mayúscula y las reemplaza con el primero, un espacio y el último (que los separa eficazmente con un espacio). Pone a cada uno de ellos en un grupo de captura () para poder reutilizar los valores en la cadena de reemplazo mediante referencias ($1 y $2).

Para encontrar letras mayúsculas y minúsculas se utiliza \p{Ll} y \p{Lu} (en lugar de [a-z] y [A-Z]), ya que maneja todos los letras mayúsculas y minúsculas en el estándar Unicode y no sólo los que están en el rango ASCII (this nice explanation of Unicode in regexes se aplica principalmente a Java también).

+0

+1 de hecho la solución inteligente! – Nishant

+0

+1 para una explicación completa –

1

Si no desea usar expresiones regulares, puede recorrer los caracteres de la cadena, agregarlos a un generador de cadenas (y agregar un espacio al generador de cadenas si encuentra una letra mayúscula que no es la primera) :

String s = "HelloWorld"; 
StringBuilder result = new StringBuilder(); 
for(int i=0 ; i<s.length() ; i++) { 
    char c = s.charAt(i); 
    if(i!=0&&Character.isUpperCase(c)) { 
     result.append(' '); 
    } 
    result.append(c); 
} 
+0

Conozco este método, como lo mencioné en las p. – Emil

+0

@Emil - Dijiste que estabas al tanto de usar split de cadena y luego combinar, ¡este método no usa split una vez, ni emula su comportamiento! – berry120

+0

Lo siento, no me di cuenta. – Emil

0

Pseudocódigo:

String source = ...; 
String result = ""; 

// FIXME: check for enf-of-source 

for each letter in source { 
    while current letter not uppercase { 
     push the letter to result; 
     advance one letter; 
    } 
    if not the first letter { 
     push space to result; 
    } 
    push the letter to result; 
} 
4

Mejor es subjetiva. Esto toma algo más líneas de código:

public static String deCamelCasealize(String camelCasedString) { 
    if (camelCasedString == null || camelCasedString.isEmpty()) 
     return camelCasedString; 

    StringBuilder result = new StringBuilder(); 
    result.append(camelCasedString.charAt(0)); 
    for (int i = 1; i < camelCasedString.length(); i++) { 
     if (Character.isUpperCase(camelCasedString.charAt(i))) 
     result.append(" "); 
     result.append(camelCasedString.charAt(i)); 
    } 
    return result.toString(); 
} 

Ocultar esta fea de implementación en una clase de utilidad y lo utilizan como una API (se ve bien desde la perspectiva del usuario;))

+0

+1 es una buena implementación pero prefiero la expresión regular. Solo tengo que encubrir algunas cadenas. – Emil

2
String s = "HelloWorldNishant"; 
    StringBuilder out = new StringBuilder(s); 
    Pattern p = Pattern.compile("[A-Z]"); 
    Matcher m = p.matcher(s); 
    int extraFeed = 0; 
    while(m.find()){ 
     if(m.start()!=0){ 
      out = out.insert(m.start()+extraFeed, " "); 
      extraFeed++; 
     } 
    } 
    System.out.println(out); 

impresiones

Hello World Nishant

Cuestiones relacionadas