Een string splitsen op spatie

Ik moet mijn String splitsen door spaties.
Hiervoor heb ik geprobeerd:

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

Maar het lijkt niet te werken.


Antwoord 1, autoriteit 100%

Wat je hebt, zou moeten werken. Als de beschikbare spaties echter standaard zijn… iets anders? U kunt de witruimte-regex gebruiken:

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

Dit zorgt ervoor dat een willekeurig aantal opeenvolgende spaties je string in tokens splitst.

Als een kanttekening, ik weet niet zeker of “gesplitst” een woord is 🙂 Ik geloof dat het slachtoffer zijn van een splitsing ook “gesplitst” is. Het is een van die lastige grammaticale dingen 🙂 Ik probeer niet kieskeurig te zijn, ik dacht ik geef het door!


Antwoord 2, autoriteit 15%

Hoewel het geaccepteerde antwoord goed is, moet u er rekening mee houden dat u een leidende lege tekenreeks krijgt als uw invoerreeks begint met een spatie. Bijvoorbeeld met:

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

Het resultaat is:

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

Dus misschien wil je je string inkorten voordat je hem splitst:

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

[bewerken]

Naast het voorbehoud trim, kunt u ook het vaste unicode-spatieteken (U+00A0) overwegen. Dit teken wordt net als een gewone spatie in een tekenreeks afgedrukt en ligt vaak op de loer in gekopieerde tekst van RTF-editors of webpagina’s. Ze worden niet afgehandeld door .trim()die test op tekens die moeten worden verwijderd met behulp van c <= ' '; \szullen ze ook niet vangen.

In plaats daarvan kunt u \p{Blank}gebruiken, maar u moet ook ondersteuning voor unicode-tekens inschakelen, wat de normale splitniet zal doen. Dit zal bijvoorbeeld werken: Pattern.compile("\\p{Blank}", UNICODE_CHARACTER_CLASS).split(words)maar het zal het gedeelte trimniet doen .

Het volgende toont het probleem en biedt een oplossing. Het is vervan optimaal om hiervoor op regex te vertrouwen, maar nu Java 8bit / 16bit byte-representatie heeft, wordt een efficiënte oplossing hiervoor behoorlijk 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("][")) + "]");
    }
}

Resulteert 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]

Antwoord 3, autoriteit 4%

Ik geloof dat het plaatsen van een reguliere expressie tussen haakjes str.split het probleem zou moeten oplossen. De methode Java String.split() is gebaseerd op reguliere expressies, dus wat je nodig hebt is:

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

Antwoord 4, autoriteit 2%

Gebruik Stringutils.split()om de string te splitsen in witte stappen. Bijvoorbeeld StringUtils.split("Hello World")geeft als resultaat “Hallo” en “Wereld”;

Om het genoemde geval op te lossen gebruiken we de split-methode zoals deze

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

wanneer we de gesplitste array afdrukken, is de uitvoer:

Hallo

Ik ben

uw

String

Kijk hier voor een volledige voorbeelddemo


Antwoord 5

Probeer

String[] splited = str.split("\\s");

http://download.oracle.com/javase/tutorial/ essential/regex/pre_char_classes.html


Antwoord 6

Als je op de een of andere manier de String split-methode niet wilt gebruiken, kun je de StringTokenizer-klasse in Java gebruiken als..

   StringTokenizer tokens = new StringTokenizer("Hello I'm your String", " ");
    String[] splited = new String[tokens.countTokens()];
    int index = 0;
    while(tokens.hasMoreTokens()){
        splited[index] = tokens.nextToken();
        ++index;
    }

Antwoord 7

Probeer deze eens

   String str = "This is String";
    String[] splited = str.split("\\s+");
    String split_one=splited[0];
    String split_second=splited[1];
    String split_three=splited[2];
   Log.d("Splited String ", "Splited String" + split_one+split_second+split_three);

Antwoord 8

OK, dus we moeten splitsen omdat je het antwoord al hebt, ik zou het generaliseren.

Als je een tekenreeks wilt splitsen door spaties, gebruik dan scheidingsteken (speciale tekens).

Verwijder eerst de voorloopruimte aangezien deze de meeste problemen veroorzaken.

str1 = "    Hello I'm your       String    ";
str2 = "    Are you serious about this question_  boy, aren't you?   ";

Verwijder eerst de voorloopspatie die spatie, tab enz. kan zijn.

String s = str1.replaceAll("^\\s+","");//starting with whitespace one or more

Als je nu wilt splitsen op spatie of een speciaal teken.

String[] sa = s.split("[^\\w]+");//split by any non word char

Maar aangezien w [a-zA-Z_0-9] bevat, dus als je wilt splitsen door underscore(_) gebruik je ook

String[] sa = s.split("[!,? ._'@]+");//for str2 after removing leading space

Antwoord 9

Een alternatieve manier zou zijn:

import java.util.regex.Pattern;
...
private static final Pattern SPACE = Pattern.compile(" ");
String[] arr = SPACE.split(str); // str is the string to be split

Ik heb het gezien hier


Antwoord 10

Heel eenvoudig voorbeeld hieronder:

Hopelijk helpt het.

String str = "Hello I'm your String";
String[] splited = str.split(" ");
var splited = str.split(" ");
var splited1=splited[0]; //Hello
var splited2=splited[1]; //I'm
var splited3=splited[2]; //your
var splited4=splited[3]; //String

Antwoord 11

je kunt strings versimpelen met de onderstaande code

  String thisString="Hello world";
   String[] parts = theString.split(" ");
   String first = parts[0];//"hello"
    String second = parts[1];//"World"

Antwoord 12

Aangezien het een tijdje geleden is dat deze antwoorden zijn gepost, is hier nog een meer actuele manier om te doen wat er wordt gevraagd:

List<String> output = new ArrayList<>();
try (Scanner sc = new Scanner(inputString)) {
    while (sc.hasNext()) output.add(sc.next());
}

Nu heb je een lijst met strings (wat aantoonbaar beter is dan een array); als je een array nodig hebt, kun je output.toArray(new String[0]);

doen


Antwoord 13

Hier is een methode om een ​​tekenreeks met een “,” of witruimte in te korten

private String shorterName(String s){
        String[] sArr = s.split("\\,|\\s+");
        String output = sArr[0];
        return output;
    }

Antwoord 14

Niet alleen witruimte, maar mijn oplossing lost ook de onzichtbare tekens op.

str = "Hello I'm your String";
String[] splited = str.split("\p{Z}");

Antwoord 15

Eenvoudig om string per spatie te spugen

   String CurrentString = "First Second Last";
    String[] separated = CurrentString.split(" ");
    for (int i = 0; i < separated.length; i++) {
         if (i == 0) {
             Log.d("FName ** ", "" + separated[0].trim() + "\n ");
         } else if (i == 1) {
             Log.d("MName ** ", "" + separated[1].trim() + "\n ");
         } else if (i == 2) {
             Log.d("LName ** ", "" + separated[2].trim());
         }
     }

Other episodes