2010-09-20 13 views
36

Ich denke, dies ist eine einfache Frage, aber ich bin nicht in der Lage, eine einfache Lösung zu finden (zum Beispiel weniger als 10 Zeilen Code :)Java: Split-String, wenn ein Großbuchstabe gefunden

Ich habe ein String wie "thisIsMyString" und ich muss es in eine String[] {"this", "Is", "My", "String"} konvertieren.

Bitte beachten Sie, dass der erste Buchstabe kein Großbuchstabe ist.

Antwort

88

Sie können eine regexp mit Null-Breite positive Vorschau verwenden - es findet Großbuchstaben, aber nicht, sie in Trennzeichen enthalten:

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

Y(?=X)Y Matches von X gefolgt, aber nicht enthalten X in Spiel. So passt (?=\\p{Upper}) eine leere Sequenz gefolgt von einem Großbuchstaben und split verwendet es als ein Trennzeichen.

Weitere Informationen zur Java-Regexp-Syntax finden Sie unter javadoc.

EDIT: Übrigens funktioniert es nicht mit thisIsMyÜberString auch. Für Nicht-ASCII-Großbuchstaben benötigen Sie eine Unicode Großbuchstaben Klasse statt POSIX ein:

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

+1, waren Sie zum ersten Mal (nach einigen Sekunden), + Erklärung, + die vordefinierte Oberschicht :) – Bozho

+1

Seien Sie sich bewusst sein, dass, wenn die oberen Zeichen die letzte in der Kette sind, dass Sie nicht erhalten ein leerer str für das darüber liegende Bit, z das Teilen von "H2W" wird "{", "2"} zurückgeben, wobei "" das Bit vor "H" ist, und "2" ist das Bit in der Mitte. Normalerweise kein Problem, aber es kann Annahmen darüber, wie viele Teile zurückgegeben werden, brechen. – locka

+0

@locka: Gibt es einen anderen Weg als die explizite Überprüfung? – Jeremy

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

Funktioniert nicht für "thisIsMyÜberString". – jarnbjo

+1

axtavt hat Guidos Frage schon richtig beantwortet, also warum zweimal antworten? Deine Antwort ist falsch, also habe ich es runtergezählt und wies warum. – jarnbjo

+0

@jarnbjo seine Antwort funktionierte zunächst nicht für Umlaut. – Bozho

5

Da String::split einen regulären Ausdruck nehmen Sie einen Vorgriff verwenden:

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

Try Dies;

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

... 
10

Für jeden, der fragt sich, wie das Muster ist, wenn der String aufzuspalten mit einem Großbuchstaben beginnen könnten:

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

gibt: [Dies ist, My, String]

+0

Dies ist ** nicht ** eine Antwort auf die ursprüngliche Frage.Um einen Autor zu kritisieren oder um Klärung zu bitten, hinterlasse einen Kommentar unter seinem Beitrag - du kannst deine eigenen Beiträge jederzeit kommentieren, und sobald du genügend [Reputation] (http://stackoverflow.com/help/whats-reputation) hast, wirst du das tun in der Lage sein [jeden Beitrag kommentieren] (http://stackoverflow.com/help/privileges/comment). – DavidPostill

+0

Danke für die Zugabe! – serj

0

Dieser Regex wird auf Caps aufgeteilt, wobei der erste weggelassen wird. Also sollte es für Camel-Case und Proper-Case funktionieren.

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

TestText = Test, Text 
thisIsATest = this, Is, A, Test 
Verwandte Themen