2010-09-20 26 views
36

penso che questo è una domanda facile, ma io non sono in grado di trovare una soluzione semplice (ad esempio, meno di 10 righe di codice :)Java: stringa di Spalato, quando una lettera maiuscola si trova

Ho un String come "thisIsMyString" e ho bisogno di convertirlo in un String[] {"this", "Is", "My", "String"}.

Si prega di notare che la prima lettera non è maiuscola.

risposta

88

Si può usare un'espressione regolare con larghezza zero lookahead positivo - si trovano le lettere maiuscole, ma non li include in delimitatore:

String s = "thisIsMyString"; 
String[] r = s.split("(?=\\p{Upper})"); 

Y(?=X) partite Y seguito da X, ma non include X in incontro. Quindi (?=\\p{Upper}) corrisponde a una sequenza vuota seguita da una lettera maiuscola e split lo utilizza come delimitatore.

Vedere javadoc per ulteriori informazioni sulla sintassi regexp di Java.

MODIFICA: Inoltre, non funziona con thisIsMyÜberString. Per i non-ASCII lettere maiuscole è necessario un Unicode classe di caratteri maiuscoli, invece di POSIX uno:

String[] r = s.split("(?=\\p{Lu})"); 
+2

+1, si erano prima (per pochi secondi), + spiegazione, + la classe superiore predefinita :) – Bozho

+1

Basta essere consapevoli che se il personaggio superiore è l'ultimo nella stringa che non riceverai uno str vuoto per il poco oltre, es la divisione "H2W" restituirà {"", "2"} dove "" è il bit prima di "H" e "2" è il bit nel mezzo. Normalmente non è un problema, ma può rompere ipotesi su quante parti vengono restituite. – locka

+0

@locka: c'è un modo per aggirare questo, oltre al controllo esplicito? – Jeremy

16
String[] camelCaseWords = s.split("(?=[A-Z])"); 
+1

Non funziona con "thisIsMyÜberString". – jarnbjo

+1

axtavt ha già dato una risposta corretta alla domanda di Guido, quindi perché rispondere due volte? La tua risposta è sbagliata, quindi l'ho downvoted e ho sottolineato perché. – jarnbjo

+0

@jarnbjo inizialmente la sua risposta non funzionava per l'umlaut. – Bozho

5

Dal String::split prende un'espressione regolare si può usare un look-ahead:

String[] x = "thisIsMyString".split("(?=[A-Z])"); 
0

Try Questo;

static Pattern p = Pattern.compile("(?=\\p{Lu})"); 
String[] s1 = p.split("thisIsMyFirstString"); 
String[] s2 = p.split("thisIsMySecondString"); 

... 
10

Per tutti coloro che si chiede come il modello è quando la stringa da dividere potrebbe iniziare con un carattere maiuscolo:

String s = "ThisIsMyString"; 
String[] r = s.split("(?<=.)(?=\\p{Lu})"); 
System.out.println(Arrays.toString(r)); 

dà: [Questo, è, mio, String]

+0

Questa è ** non ** una risposta alla domanda originale.Per criticare o richiedere chiarimenti da un autore, lascia un commento sotto il loro post - puoi sempre commentare i tuoi post, e una volta che hai [reputazione] sufficiente (http://stackoverflow.com/help/whats-reputation) essere in grado di [commentare qualsiasi post] (http://stackoverflow.com/help/privileges/comment). – DavidPostill

+0

Grazie per l'aggiunta! – serj

0

Questa espressione regolare sarà divisa in Caps, omettendo il primo. Quindi dovrebbe funzionare per cammello-caso e caso appropriato.

(?<=.)(?=(\\p{Upper})) 

TestText = Test, Text 
thisIsATest = this, Is, A, Test 
Problemi correlati