CodeGym /Java Blog /Willekeurig /Java String.split()-methode
John Squirrels
Niveau 41
San Francisco

Java String.split()-methode

Gepubliceerd in de groep Willekeurig
Laten we het hebben over Java's String.split- methode: wat het doet en waarom het nodig is. Het is niet moeilijk te raden dat het een Java-string splitst, maar hoe werkt dit in de praktijk? Laten we dieper ingaan op de werking van de methode en enkele niet voor de hand liggende details bespreken. Tegelijkertijd zullen we leren hoeveel split- methoden de string eigenlijk heeft. Laten we gaan!

Beschrijving en handtekening voor Java's String.split

In Java splitst de split- methode een tekenreeks in subtekenreeksen met behulp van een scheidingsteken dat is gedefinieerd met behulp van een reguliere expressie. Laten we de handtekening van de methode presenteren en onze duik beginnen:

String[] split(String regex)
Uit de ondertekening worden twee dingen duidelijk:
  1. De methode retourneert een reeks strings.
  2. De methode heeft een tekenreeksinvoerparameter genaamd regex .
Laten we elk van deze afzonderlijk analyseren terwijl we de bovenstaande beschrijving opsplitsen.
  1. De methode retourneert een reeks strings.

    De declaratie bevat de volgende woorden: "In Java splitst de splitsmethode een string in substrings." De methode verzamelt deze subtekenreeksen in een array die de retourwaarde wordt.

  2. De methode heeft een tekenreeksinvoerparameter genaamd regex .

    Nogmaals, onthoud de beschrijving: "splitst een tekenreeks in subtekenreeksen met behulp van een scheidingsteken dat is gedefinieerd met behulp van een reguliere expressie." De invoerparameter regex is een reguliere expressie die wordt toegepast op de oorspronkelijke tekenreeks. Wanneer het teken of de combinatie van tekens overeenkomt, worden ze behandeld als een scheidingsteken.

De methode String.split() in Java: een string splitsen in delen - 1

Java's splitsing in de praktijk

Laten we nu dichter bij het punt komen. Laten we ons voorstellen dat we een reeks woorden hebben. Bijvoorbeeld als volgt:
Ik hou van Java
We moeten de string in woorden splitsen. We zien dat de woorden in deze string door spaties van elkaar gescheiden zijn. In dit geval is een spatie de perfecte kandidaat voor ons scheidingsteken. De code voor het oplossen van onze taak ziet er als volgt uit:

public class Main {
    public static void main(String[] args) {
        String str = "I love Java";
        String[] words = str.split(" ");
        for (String word : words) {
            System.out.println(word);
        }
    }
}
De uitvoer van de hoofdmethode zal de volgende regels zijn:
Ik hou van Java
Laten we nog een paar voorbeelden bekijken van hoe de split- methode zou werken:
Snaar scheidingsteken Resultaat van de methode
"Ik hou van Java" " " (spatie) { "Ik" , "liefde" , "Java" }
"192.168.0.1:8080" ":" { "192.168.0.1" , "8080" }
"Rood, oranje, geel" "," { "Rood" , "oranje" , "geel" }
"Rood, oranje, geel" ", " { "Rood" , "oranje" , "geel" }
Let op de verschillen tussen de laatste twee rijen in de bovenstaande tabel. In de voorlaatste rij wordt een komma gebruikt als scheidingsteken. Als gevolg hiervan hebben sommige woorden voorloopspaties wanneer de tekenreeks wordt gesplitst. In de laatste rij gebruikten we een komma en een spatie als scheidingsteken. Daarom waren er geen subtekenreeksen met voorloopspaties in de resulterende array. Dit is slechts een subtiel detail dat laat zien hoe belangrijk het is om zorgvuldig het juiste scheidingsteken te kiezen.

Leidend scheidingsteken

Dit is een andere belangrijke nuance. Als de originele string begint met het scheidingsteken, dan is het eerste element van de resulterende array een lege string. Het ziet er bijvoorbeeld zo uit: Originele tekenreeks: " I love Java" Scheidingsteken: " " Resulterende array: { "", "I", "love", "Java" } Maar als de originele tekenreeks eindigt met een scheidingsteken in plaats dan met één te beginnen, zal het resultaat anders zijn: Oorspronkelijke tekenreeks: "I love Java " Scheidingsteken: " " Resulterende array: { "I", "love", "Java"

public class Main {
    public static void main(String[] args) {
        print("I love Java".split(" "));
        print(" I love Java".split(" "));
        print("I love Java ".split(" "));
        print(" I love Java ".split(" "));
    }

    static void print(String[] arr) {
        System.out.println(Arrays.toString(arr));
    }
}
De uitvoer van de hoofdmethode ziet er als volgt uit:
[Ik, liefde, Java] [, ik, liefde, Java] [Ik, liefde, Java] [, ik, liefde, Java]
Richt nogmaals uw aandacht op het feit dat wanneer het eerste teken in de originele string een scheidingsteken is, het resultaat is dat het eerste element in de array een lege string zal zijn.

Overbelaste broer

De klasse String heeft nog een andere splitmethode met de volgende signatuur:

String[] split(String regex, int limit)
Deze methode heeft een extra limietparameter : deze bepaalt hoe vaak het regex- patroon wordt toegepast op de oorspronkelijke tekenreeks. Zie de uitleg hieronder:

grens > 0

Het patroon wordt limiet -1 keer toegepast . Bovendien zal de lengte van de geretourneerde array de waarde van de limit parameter niet overschrijden. Het laatste element van de array is het deel van de tekenreeks dat volgt op de laatste plaats waar het scheidingsteken is gevonden. Voorbeeld:

public class Main {
    public static void main(String[] args) {
        print("I love Java".split(" ", 1));
        print("I love Java".split(" ", 2));
        /*
         Output: 
         [I love Java]
         [I, love Java]
        */
    }

    static void print(String[] arr) {
        System.out.println(Arrays.toString(arr));
    }
}

limiet < 0

De reguliere expressie voor het scheidingsteken wordt zo vaak mogelijk op de tekenreeks toegepast. De resulterende array kan elke lengte hebben. Voorbeeld:

public class Main {
    public static void main(String[] args) {
        // Note the space at the end of the string
        print("I love Java ".split(" ", -1));
        print("I love Java ".split(" ", -2));
        print("I love Java ".split(" ", -12));
        /*
         Output:
        [I, love, Java, ]
        [I, love, Java, ]
        [I, love, Java, ]
        
        Please note that the last element of the array is
        an empty string. This is caused by the whitespace
        at the end of the original string. 
        */
    }

    static void print(String[] arr) {
        System.out.println(Arrays.toString(arr));
    }
}

limiet = 0

Net als bij limiet < 0, wordt het scheidingstekenpatroon zo vaak mogelijk op de tekenreeks toegepast. De uiteindelijke array kan elke lengte hebben. Als de laatste elementen lege strings zijn, worden ze verwijderd uit de uiteindelijke array. Voorbeeld:

public class Main {
    public static void main(String[] args) {
        // Note the space at the end of the string
        print("I love Java ".split(" ", 0));
        print("I love Java ".split(" ", 0));
        print("I love Java ".split(" ", 0));
        /*
         Output:
        [I, love, Java]
        [I, love, Java]
        [I, love, Java]
        Note the absence of empty strings at the end of the arrays
        */
    }

    static void print(String[] arr) {
        System.out.println(Arrays.toString(arr));
    }
}
Als we kijken naar de implementatie van de versie met één parameter van de splitmethode , dan kunnen we zien dat het lijkt op zijn overbelaste broer of zus, maar met het tweede argument op nul:

    public String[] split(String regex) {
        return split(regex, 0);
    }

Diverse voorbeelden

In de praktijk komt het soms voor dat we strings hebben die volgens bepaalde regels worden gegenereerd. Zo'n string kan overal vandaan in ons programma komen:
  • van een service van een derde partij;
  • van een verzoek dat naar onze server is verzonden;
  • vanuit een configuratiebestand;
  • enzovoort.
In deze situaties kent de programmeur meestal de "spelregels". Laten we zeggen dat een programmeur weet dat hij of zij te maken heeft met gebruikersinformatie die volgens dit patroon is opgeslagen:
user_id|user_login|user_email
Laten we enkele specifieke waarden als voorbeeld nemen:
135|buiger|buiger@gmail.com
Stel dat het de taak van de programmeur is om een ​​methode te schrijven die een e-mail naar de gebruiker stuurt. De programmeur heeft toegang tot gebruikersgegevens, die zijn vastgelegd in het hierboven aangegeven formaat. De subtaak die we nu verder gaan analyseren, is hoe het e-mailadres te isoleren van de rest van de gebruikersgegevens. Dit is een geval waarin de splitsmethode nuttig kan zijn. Als we naar het gebruikersgegevenssjabloon kijken, realiseren we ons immers dat het extraheren van het e-mailadres van de gebruiker uit de rest eenvoudig is, net als het aanroepen van de split- methode om de string te splitsen. Dan staat het e-mailadres in het laatste element van de resulterende array. Hier is een voorbeeld van een methode die een string met gebruikersgegevens neemt en het e-mailadres van de gebruiker retourneert. Laten we voor de eenvoud zeggen dat de datareeks altijd de gewenste indeling heeft:

public class Main {
    public static void main(String[] args) {
        String userInfo = "135|bender|bender@gmail.com";
        System.out.println(getUserEmail(userInfo));
        // Output: bender@gmail.com
    }

    static String getUserEmail(String userInfo) {
        String[] data = userInfo.split("\\|");
        return data[2]; // or data[data.length - 1]
    }
}
Let op het scheidingsteken: "\\|" . In reguliere expressies, "|" is een speciaal teken met een speciale betekenis, dus als we het een gewoon teken willen gebruiken (dwz wat we willen vinden in de originele tekenreeks), dan moeten we het teken ontsnappen met twee backslashes. Overweeg een ander voorbeeld. Laten we zeggen dat we bestelinformatie hebben die als volgt is gestructureerd:
item_nummer_1,item_name_1,item_price_1;item_nummer_2,item_name_2,item_price_2;...;item_number_n,item_name_n,item_price_n
Of we kunnen zelfs enkele specifieke waarden aannemen:
1,komkommers,2.39;2,tomaten,1.89;3,spek,4.99
Onze taak is om de totale kosten van de bestelling te berekenen. Hier zullen we de split- methode meerdere keren moeten toepassen . De eerste stap is om de string te splitsen met ";" als scheidingsteken om het op te splitsen in zijn samenstellende delen. Elke resulterende substring bevat dan informatie over een afzonderlijk product, die we later kunnen verwerken. Vervolgens splitsen we voor elk product de bijbehorende informatie op met behulp van het symbool ",". We nemen een element met een specifieke index (degene waarin de productprijs is opgeslagen) uit de resulterende stringarray, zetten deze om in een numerieke vorm en tellen de totale kosten van de bestelling op. Laten we een methode schrijven die al deze berekeningen zal doen:

public class Main {
    public static void main(String[] args) {
        String orderInfo = "1,cucumbers,2.39;2,tomatoes,1.89;3,bacon,4.99";
        System.out.println(getTotalOrderAmount(orderInfo));
        // Output: 9.27
    }

    static double getTotalOrderAmount(String orderInfo) {
        double totalAmount = 0d;
        final String[] items = orderInfo.split(";");

        for (String item : items) {
            final String[] itemInfo = item.split(",");
            totalAmount += Double.parseDouble(itemInfo[2]);
        }

        return totalAmount;
    }
}
Kijk of je zelf kunt achterhalen hoe deze methode werkt. Op basis van deze voorbeelden kunnen we zeggen dat de split- methode wordt gebruikt wanneer we gegevens hebben die zijn opgemaakt als een string en we er bepaalde, meer specifieke informatie uit moeten halen.

Samenvatting

We hebben de split- methode van de klasse String onderzocht . Het is precies wat je nodig hebt als je een string in zijn samenstellende delen moet splitsen met behulp van een speciaal scheidingsteken. De methode retourneert een reeks tekenreeksen (de subtekenreeksen waaruit de oorspronkelijke tekenreeks bestaat). Het accepteert een reguliere expressie waarvan de overeenkomsten het (de) scheidingsteken(s) vertegenwoordigen. We hebben verschillende subtiliteiten van deze methode onderzocht:
  • een leidend scheidingsteken;
  • zijn overbelaste broer met twee parameters.
We hebben ook geprobeerd een aantal praktijksituaties te modelleren waarbij we de split- methode gebruikten om hypothetische, maar vrij realistische problemen op te lossen.
Opmerkingen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION