2011-02-03 33 views
18

Come convertire "HelloWorld" in "Hello World". La suddivisione deve avvenire in base alle lettere maiuscole, ma deve escludere la prima lettera.Inserire lo spazio dopo la lettera maiuscola

P.S: Sono consapevole di utilizzare String.split e poi combining.Just volevo sapere se c'è un modo migliore.

+0

distacco come un commento piuttosto che risposta perché io non conosco la sintassi. Ma sono sicuro che sarebbe molto facile scrivere un'espressione regolare che cercherebbe una lettera maiuscola (che non è all'inizio della frase) e aggiunga uno spazio prima di essa. – DaveJohnston

+1

Ti aspetti 'convert (" HELLO ") ==" H E L L O "'? – vz0

+0

@ vz0: In realtà la mia stringa avrà alcune lettere minuscole tra le lettere maiuscole. – Emil

risposta

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

This regex cercati una lettera minuscola follwed da una lettera maiuscola e li sostituisce con la precedente, uno spazio e il secondo (efficacemente separandoli con uno spazio). Inserisce ciascuno di essi in un gruppo di cattura () per poter riutilizzare i valori nella stringa di sostituzione tramite riferimenti posteriori ($1 e $2).

Per trovare maiuscole e minuscole utilizza \p{Ll} e \p{Lu} (invece di [a-z] e [A-Z]), perché gestisce tutti lettere maiuscole e minuscole nello standard Unicode e non solo quelli della gamma ASCII (this nice explanation of Unicode in regexes si applica principalmente anche a Java).

+0

+1 soluzione davvero intelligente! – Nishant

+0

+1 per spiegazione completa –

1

Se non si desidera utilizzare le espressioni regolari, è possibile scorrere i caratteri nella stringa, aggiungendoli a un costruttore di stringhe (e aggiungendo uno spazio al generatore di stringhe se si incontra una lettera maiuscola che non è la prima) :

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

Sono a conoscenza di questo metodo, come ho menzionato in p.s. – Emil

+0

@Emil - Hai detto che eri consapevole dell'utilizzo dello split split e quindi della combinazione, questo metodo non usa split una volta, né emula il suo comportamento! – berry120

+0

Mi spiace di non averlo notato. – Emil

0

pseudocodice:

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

Meglio è soggettiva. Questo richiede un po più righe di codice:

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

Nascondi questo brutto di implementazione in una classe di utilità e usarlo come un'API (sembra ok dal punto di vista dell'utente;))

+0

+1 è una buona implementazione ma preferisco regex. Devo solo nascondere alcune stringhe. – 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); 

stampe

Ciao mondo Nishant

Problemi correlati