LÄt oss prata om Javas String.split- metod: vad den gör och varför den behövs. Det Àr inte svÄrt att gissa att den delar en Java-strÀng, men hur fungerar detta i praktiken? LÄt oss dyka djupt in i hur metoden fungerar och diskutera nÄgra icke-uppenbara detaljer. Samtidigt kommer vi att lÀra oss hur mÄnga splitmetoder strÀngen faktiskt har . Nu gÄr vi!
LÀgg mÀrke till skillnaderna mellan de tvÄ sista raderna i tabellen ovan. I den nÀst sista raden anvÀnds ett kommatecken som avgrÀnsare. Som ett resultat, nÀr strÀngen delas, har nÄgra av orden inledande mellanslag. PÄ sista raden anvÀnde vi ett kommatecken och ett mellanslag som avgrÀnsare. Det Àr dÀrför det inte fanns nÄgra delstrÀngar med ledande mellanslag i den resulterande arrayen. Detta Àr bara en subtil detalj som visar hur viktigt det Àr att noggrant vÀlja rÀtt avgrÀnsare.
Beskrivning och signatur för Javas String.split
I Java delar splitmetoden en strÀng i delstrÀngar med hjÀlp av en avgrÀnsare som definieras med ett reguljÀrt uttryck . LÄt oss presentera metodsignaturen och börja vÄrt dyk:
String[] split(String regex)
TvÄ saker framgÄr av signaturen:
- Metoden returnerar en array av strÀngar.
- Metoden har en strÀnginmatningsparameter som kallas regex .
-
Metoden returnerar en array av strÀngar.
Deklarationen innehÄller följande ord: "I Java delar split- metoden en strÀng i delstrÀngar." Metoden samlar dessa delstrÀngar till en array som blir returvÀrdet.
-
Metoden har en strÀnginmatningsparameter som kallas regex .
à terigen, kom ihÄg beskrivningen: "delar en strÀng i delstrÀngar med hjÀlp av en avgrÀnsare definierad med ett reguljÀrt uttryck." Indataparametern för regex Àr ett reguljÀrt uttryck som tillÀmpas pÄ den ursprungliga strÀngen. NÀr tecknet eller kombinationen av tecken matchar, behandlas de som en avgrÀnsare.

Java har splittrats i praktiken
LÄt oss nu komma nÀrmare saken. LÄt oss förestÀlla oss att vi har en rad ord. Till exempel, sÄ hÀr:
Jag Àlskar Java
Vi mÄste dela upp strÀngen i ord. Vi ser att orden i denna strÀng Àr separerade frÄn varandra med mellanslag. I det hÀr fallet Àr ett mellanslagstecken den perfekta kandidaten för vÄr avgrÀnsare. Koden för att lösa vÄr uppgift skulle se ut sÄ hÀr:
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);
}
}
}
Utdata frÄn huvudmetoden kommer att vara följande rader:
Jag Àlskar Java
LÄt oss se nÄgra fler exempel pÄ hur uppdelningsmetoden skulle fungera:
StrÀng | AvgrÀnsare | Resultat av metoden |
"Jag Àlskar Java" | " " (mellanslag) | { "Jag" , "kÀrlek" , "Java" } |
"192.168.0.1:8080" | ":" | { "192.168.0.1" , "8080" } |
"Rött, orange, gult" | "," | { "Röd" , "orange" , "gul" } |
"Rött, orange, gult" | ", " | { "Röd" , "orange" , "gul" } |
Ledande avgrÀnsare
Detta Àr en annan viktig nyans. Om den ursprungliga strÀngen börjar med avgrÀnsaren, kommer det första elementet i den resulterande arrayen att vara en tom strÀng. Till exempel skulle det se ut sÄ hÀr: OriginalstrÀng: " Jag Àlskar Java" AvgrÀnsare: " " Resulterande array: { "", "I", "love", "Java" } Men om den ursprungliga strÀngen slutar med en avgrÀnsare snarare Àn att börja med en, dÄ blir resultatet annorlunda: OriginalstrÀng: "Jag Àlskar Java " AvgrÀnsare: " " Resulterande 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));
}
}
Huvudmetodens utdata blir sÄ hÀr :
[Jag, Àlskar, Java] [, Jag, Àlskar, Java] [Jag, Àlskar, Java] [, Jag, Àlskar, Java]
Ă
terigen rikta uppmÀrksamheten mot det faktum att nÀr det första tecknet i den ursprungliga strÀngen Àr ett avgrÀnsningstecken, blir resultatet att det första elementet i arrayen blir en tom strÀng.
Ăverbelastat syskon
Klassen String har en annan delad metod med följande signatur:
String[] split(String regex, int limit)
Den hÀr metoden har en extra grÀnsparameter : den bestÀmmer hur mÄnga gÄnger regexmönstret kommer att tillÀmpas pÄ den ursprungliga strÀngen. Se förklaringarna nedan:
grÀns > 0
Mönstret tillÀmpas limit -1 gÄnger. Dessutom kommer lÀngden pÄ den returnerade arrayen inte att överstiga vÀrdet pÄ limit -parametern. Det sista elementet i arrayen kommer att vara den del av strÀngen som följer den sista platsen dÀr avgrÀnsaren hittades. Exempel:
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));
}
}
grÀns < 0
Det reguljÀra uttrycket avgrÀnsare tillÀmpas pÄ strÀngen sÄ mÄnga gÄnger som möjligt. Den resulterande matrisen kan ha vilken lÀngd som helst. Exempel:
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));
}
}
grÀns = 0
Som med fallet dÀr limit < 0, appliceras avgrÀnsningsmönstret pÄ strÀngen sÄ mÄnga gÄnger som möjligt. Den slutliga arrayen kan ha vilken lÀngd som helst. Om de sista elementen Àr tomma strÀngar kasseras de frÄn den slutliga arrayen. Exempel:
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));
}
}
Om vi ââtittar pĂ„ implementeringen av versionen med en parameter av splitmetoden, kan vi se att det Ă€r som sitt överbelastade syskon, men med det andra argumentet satt till noll:
public String[] split(String regex) {
return split(regex, 0);
}
Olika exempel
I den verkliga praktiken hÀnder det ibland att vi har strÀngar som genereras enligt vissa regler. En sÄdan strÀng kan komma in i vÄrt program var som helst:- frÄn en tredjepartstjÀnst;
- frÄn en begÀran skickad till vÄr server;
- frÄn en konfigurationsfil;
- och sÄ vidare.
user_id|user_login|user_email
LÄt oss ta nÄgra specifika vÀrden som exempel:
135|bender|bender@gmail.com
Anta att programmerarens uppgift Àr att skriva en metod som skickar ett e-postmeddelande till anvÀndaren. Programmeraren har tillgÄng till anvÀndardata, som registreras i det format som anges ovan. Deluppgiften som vi nu kommer att fortsÀtta att analysera Àr hur man isolerar e-postadressen frÄn resten av anvÀndardata. Detta Àr ett fall dÀr splitmetoden kan vara anvÀndbar. NÀr allt kommer omkring, om vi tittar pÄ anvÀndardatamallen inser vi att att extrahera anvÀndarens e-postadress frÄn resten Àr enkelt som att anropa splitmetoden för att dela strÀngen. DÄ kommer e-postadressen att finnas i det sista elementet i den resulterande arrayen. HÀr Àr ett exempel pÄ en metod som tar en strÀng som innehÄller anvÀndardata och returnerar anvÀndarens e-postadress. För enkelhetens skull, lÄt oss sÀga att datastrÀngen alltid Àr i det format vi vill ha:
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]
}
}
LÀgg mÀrke till avgrÀnsaren: "\\|" . I reguljÀra uttryck, "|" Àr ett specialtecken med speciell betydelse, sÄ om vi vill anvÀnda det som ett vanligt tecken (dvs det vi vill hitta i den ursprungliga strÀngen), mÄste vi undkomma tecknet med tvÄ snedstreck. TÀnk pÄ ett annat exempel. LÄt oss sÀga att vi har orderinformation som Àr strukturerad sÄ hÀr:
artikelnummer_1, artikelnamn_1, artikelpris_1; artikelnummer_2, artikelnamn_2, artikelpris2;...;varunummer_n, artikelnamn_n, artikelpris_n
Eller sÄ kan vi till och med anta nÄgra specifika vÀrderingar:
1,gurka,2.39;2,tomater,1.89;3,bacon,4.99
VÄr uppgift Àr att berÀkna den totala kostnaden för bestÀllningen. HÀr mÄste vi tillÀmpa splitmetoden flera gÄnger. Det första steget Àr att dela strÀngen med ";" som avgrÀnsare för att dela upp den i dess bestÄndsdelar. Sedan kommer varje resulterande delstrÀng att innehÄlla information om en separat produkt, som vi kan bearbeta senare. Sedan, för varje produkt, delar vi upp motsvarande information med hjÀlp av "," symbolen. Vi tar ett element med ett specifikt index (det dÀr produktpriset lagras) frÄn den resulterande strÀngarrayen, konverterar den till numerisk form och rÀknar upp den totala kostnaden för bestÀllningen. LÄt oss skriva en metod som gör alla dessa berÀkningar:
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;
}
}
Se om du kan ta reda pÄ hur den hÀr metoden fungerar pÄ egen hand. Baserat pÄ dessa exempel kan vi sÀga att splitmetoden anvÀnds nÀr vi har en del data formaterad som en strÀng, och vi behöver extrahera viss mer specifik information frÄn den.
Sammanfattning
Vi undersökte splitmetoden för String -klassen. Det Àr precis vad du behöver nÀr du ska dela en strÀng i dess bestÄndsdelar med hjÀlp av en speciell avgrÀnsare. Metoden returnerar en array av strÀngar (delstrÀngarna som utgör den ursprungliga strÀngen). Det accepterar ett reguljÀrt uttryck vars matchningar representerar avgrÀnsningstecknen. Vi undersökte olika subtiliteter av denna metod:- en ledande avgrÀnsare;
- dess överbelastade syskon med tvÄ parametrar.
GO TO FULL VERSION