452 Stimmen

Wie man einen String durch ein Leerzeichen trennt

Ich muss meinen String durch Leerzeichen trennen. Dafür habe ich versucht:

str = "Hello I'm your String";
String[] splited = str.split(" ");

Aber es scheint nicht zu funktionieren.

827voto

corsiKa Punkte 79125

Was Sie haben, sollte funktionieren. Wenn jedoch die angegebenen Leerzeichen standardmäßig für... etwas anderes stehen? Sie können den Whitespace Regex verwenden:

str = "Hello I'm your String";
String[] splited = str.split("\\s+");

Dies führt dazu, dass eine beliebige Anzahl von aufeinanderfolgenden Leerzeichen die Zeichenfolge in Token aufteilt.

140voto

GaspardP Punkte 3777

Die akzeptierte Antwort ist zwar gut, aber beachten Sie, dass Sie einen führenden leeren String erhalten, wenn Ihr Eingabe-String mit einem Leerzeichen beginnt. Zum Beispiel mit:

String str = " Hello I'm your String";
String[] splitStr = str.split("\\s+");

Das Ergebnis wird sein:

splitStr[0] == "";
splitStr[1] == "Hello";
splitStr[2] == "I'm";
splitStr[3] == "Your";
splitStr[4] == "String";

Es empfiehlt sich also, die Schnur zu trimmen, bevor sie geteilt wird:

String str = " Hello I'm your String";
String[] splitStr = str.trim().split("\\s+");

[Bearbeiten]

Zusätzlich zu den trim können Sie das Unicode-Leerzeichen ohne Umbruch ( U+00A0 ). Dieses Zeichen wird wie ein normales Leerzeichen in einer Zeichenkette gedruckt und lauert oft in kopiertem Text aus Rich-Text-Editoren oder Webseiten. Sie werden nicht behandelt von .trim() die auf zu entfernende Zeichen prüft, indem sie c <= ' ' ; \s wird sie auch nicht fangen.

Stattdessen können Sie Folgendes verwenden \p{Blank} aber Sie müssen auch die Unterstützung von Unicode-Zeichen aktivieren, die das reguläre split nicht ausreicht. Zum Beispiel wird dies funktionieren: Pattern.compile("\\p{Blank}", UNICODE_CHARACTER_CLASS).split(words) aber es wird nicht die trim Teil.

Im Folgenden wird das Problem dargestellt und eine Lösung angeboten. Es ist weit von optimal auf regex für diese verlassen, aber jetzt, dass Java 8bit / 16bit Byte-Darstellung hat, wird eine effiziente Lösung für diese ziemlich lang.

public class SplitStringTest
{
    static final Pattern TRIM_UNICODE_PATTERN = Pattern.compile("^\\p{Blank}*(.*)\\p{Blank}$", UNICODE_CHARACTER_CLASS);
    static final Pattern SPLIT_SPACE_UNICODE_PATTERN = Pattern.compile("\\p{Blank}", UNICODE_CHARACTER_CLASS);

    public static String[] trimSplitUnicodeBySpace(String str)
    {
        Matcher trimMatcher = TRIM_UNICODE_PATTERN.matcher(str);
        boolean ignore = trimMatcher.matches(); // always true but must be called since it does the actual matching/grouping
        return SPLIT_SPACE_UNICODE_PATTERN.split(trimMatcher.group(1));
    }

    @Test
    void test()
    {
        String words = " Hello I'm\u00A0your String\u00A0";
        // non-breaking space here --^ and there -----^

        String[] split = words.split(" ");
        String[] trimAndSplit = words.trim().split(" ");
        String[] splitUnicode = SPLIT_SPACE_UNICODE_PATTERN.split(words);
        String[] trimAndSplitUnicode = trimSplitUnicodeBySpace(words);

        System.out.println("words: [" + words + "]");
        System.out.println("split: [" + Arrays.stream(split).collect(Collectors.joining("][")) + "]");
        System.out.println("trimAndSplit: [" + Arrays.stream(trimAndSplit).collect(Collectors.joining("][")) + "]");
        System.out.println("splitUnicode: [" + Arrays.stream(splitUnicode).collect(Collectors.joining("][")) + "]");
        System.out.println("trimAndSplitUnicode: [" + Arrays.stream(trimAndSplitUnicode).collect(Collectors.joining("][")) + "]");
    }
}

Ergebnisse in:

words: [ Hello I'm your String ]
split: [][Hello][I'm your][String ]
trimAndSplit: [Hello][I'm your][String ]
splitUnicode: [][Hello][I'm][your][String]
trimAndSplitUnicode: [Hello][I'm][your][String]

32voto

rbrtl Punkte 771

Ich glaube, dass das Einfügen eines regulären Ausdrucks in die Klammern von str.split das Problem lösen sollte. Die Java String.split()-Methode basiert auf regulären Ausdrücken, was Sie also brauchen, ist:

str = "Hello I'm your String";
String[] splitStr = str.split("\\s+");

15voto

sandeep vanama Punkte 639

Utilice Stringutils.split() um die Zeichenkette durch Weiße Schritte zu teilen. Zum Beispiel StringUtils.split("Hello World") gibt "Hallo" und "Welt" zurück;

Um den genannten Fall zu lösen, verwenden wir die Split-Methode wie folgt

String split[]= StringUtils.split("Hello I'm your String");

Wenn wir das geteilte Array ausdrucken, lautet die Ausgabe :

Hallo

Ich bin

Ihr

Zeichenfolge

Ein vollständiges Beispiel für eine Demo finden Sie hier

12voto

Vladimir Punkte 9485

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X