it-swarm.com.de

Java: Zeichenfolge teilen, wenn Großbuchstaben gefunden werden

Ich denke, das ist eine einfache Frage, aber ich kann keine einfache Lösung finden (sagen wir weniger als 10 Zeilen Code :)

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

Bitte beachten Sie, dass der erste Buchstabe keine Großbuchstaben ist.

41
Guido

Sie können einen regulären Ausdruck mit einem positiven Lookahead mit einer Breite von Null verwenden - er findet Großbuchstaben, schließt diese jedoch nicht in das Trennzeichen ein:

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

Y(?=X) stimmt mit Y, gefolgt von X überein, schließt X jedoch nicht in match ein. So entspricht (?=\\p{Upper}) einer leeren Sequenz, gefolgt von einem Großbuchstaben, und split verwendet sie als Trennzeichen.

Siehe javadoc für weitere Informationen zur Java-Regexp-Syntax.

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

String[] r = s.split("(?=\\p{Lu})");
97
axtavt
String[] camelCaseWords = s.split("(?=[A-Z])");
17
Bozho

Für jeden, der sich wundert, wie das Muster ist, wenn der zu teilende String mit einem Großbuchstaben beginnen kann:

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

gibt: [Dies ist, Meine, Zeichenfolge]

11
Mulder

Da String::split einen regulären Ausdruck benötigt, können Sie einen Look-Ahead verwenden:

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

Ein einfacher Scala/Java-Vorschlag, der nicht in Großbuchstaben wie NYC aufgeteilt wird:

def splitAtMiddleUppercase(token: String): Iterator[String] = {
   val regex = """[\p{Lu}]*[^\p{Lu}]*""".r
   regex.findAllIn(token).filter(_ != "") // did not find a way not to produce empty strings in the regex. Open to suggestions.
}

testen mit:

val examples = List("catch22", "iPhone", "eReplacement", "TotalRecall", "NYC", "JGHSD87", "interÜber")
for( example <- examples) {
   println(example + " -> "  + splitAtMiddleUppercase(example).mkString("[", ", ", "]"))
}

es produziert:

    catch22 -> [catch22]
    iPhone -> [i, Phone]
    eReplacement -> [e, Replacement]
    TotalRecall -> [Total, Recall]
    NYC -> [NYC]
    JGHSD87 -> [JGHSD87]
    interÜber -> [inter, Über]

Ändern Sie den regulären Ausdruck so, dass auch die Ziffern abgeschnitten werden.

0
Boris

Versuche dies;

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

...
0
Spigolo Vivo

Dieser Regex wird bei Caps aufgeteilt, wobei der erste weggelassen wird. Es sollte also für Kamel-Fälle und richtige Fälle funktionieren.

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

TestText = Test, Text
thisIsATest = this, Is, A, Test
0
The Shoe Shiner