Kako razdvojiti string u Javi: detaljno objašnjenje metode split() klase String
"Brate, imam utisak da razdvajanje stringova nema šta da se objašnjava — zašto prosto ne bismo upotrebili metod split() klase String!" Sanmei reče bez ustezanja.
"Ako zaista tako misliš, pazi, stvari su daleko od toliko jednostavnih." rekoh sa osmehom.
Zamislimo sada ovakav niz karaktera "Chenmo Wang Er, jedan zabavan programer", koji treba razdvojiti po zarezu, što znači da je prvi deo niza "Chenmo Wang Er" ispred zareza, a drugi deo niza "jedan zabavan programer" iza zareza.
"Ne žuri, sačekaj da završim." nastavio sam i dalje sa osmehom: "Pre razdvajanja, prvo treba izvršiti proveru i utvrditi da li ovaj niz karaktera sadrži zarez; u suprotnom bi trebalo baciti izuzetak."
public class Test {
public static void main(String[] args) {
String cmower = "Chenmo Wang Er,jedan zabavan programer";
if (cmower.contains(",")) {
String [] parts = cmower.split(",");
System.out.println("Prvi deo: " + parts[0] +" Drugi deo: " + parts[1]);
} else {
throw new IllegalArgumentException("Trenutni string ne sadrži zarez");
}
}
}rekoh. "Hajde da pogledamo izlaz programa."
Prvi deo: Chenmo Wang Er Drugi deo: jedan zabavan programer"Zaista se potpuno poklapa sa očekivanjem." reče
"Ovo važi pod uslovom da je string utvrđen, a najvažnije je da je separator utvrđen. U suprotnom, nastaju problemi." rekoh. "Postoji oko 12 posebnih engleskih znakova — ako te posebne znakove direktno iskoristite za zamenu separatora (zareza) u gornjem kodu, ovaj program će pri izvršavanju prijaviti dole navedene greške."
- Obrnuta kosa crta
\(ArrayIndexOutOfBoundsException) - Znak umetanja
^(isto) - Znak dolara
$(isto) - Tačka
.(isto) - Uspravna crta
|(normalno, bez greške) - Znak pitanja
?(PatternSyntaxException) - Zvezdica
*(isto) - Znak plus
+(isto) - Leva ili desna mala zagrada
()(isto) - Leva ili desna uglasta zagrada
[](isto) - Leva ili desna vitičasta zagrada
{}(isto)
"Koristi regularne izraze." rekoh. "Regularni izraz je poseban tekst sastavljen od slova i znakova, pomoću kojeg se u tekstu mogu pronaći rečenice koje zadovoljavaju željeni format."
Pronašao sam na GitHub-u jednu dokumentaciju otvorenog koda za učenje regularnih izraza, veoma detaljnu. U početku, dok pišete regularne izraze, neizbežno će vam se činiti nepoznatim, pa možete pogledati ovu dokumentaciju. Nije problem ako ne zapamtite — potražite kada vam zatreba.
Pored ove dokumentacije, postoji još jedna:
Autor je prikupio neke regularne izraze koji se često koriste u svakodnevnom razvoju projekata, pa ih možete direktno iskoristiti.
"Brate, baš si pažljiv."
"Dobro, hajde da zamenimo separator tačkom .." rekoh.
String cmower = "Chenmo Wang Er.jedan zabavan programer";
if (cmower.contains(".")) {
String [] parts = cmower.split("\\.");
System.out.println("Prvi deo: " + parts[0] +" Drugi deo: " + parts[1]);
}Pošto tačka spada u posebne znakove, prilikom korišćenja metode split() potrebno je koristiti regularni izraz \\. umesto direktno ..
"Zato što je obrnuta kosa crta sama po sebi poseban karakter, pa je potrebno eskapirati je pomoću obrnute kose crte." rekoh.
Naravno, možete i da upotrebite [] da umotate tačku "." — [] je takođe regularni izraz koji se koristi za poklapanje sa bilo kojim znakom sadržanim unutar uglastih zagrada.
cmower.split("[.]");Pored toga, možete iskoristiti i metod quote() klase Pattern da umotate tačku ".". Ovaj metod vraća string umotan pomoću \Q\E.

Pogledajmo primer:
String [] parts = cmower.split(Pattern.quote("."));Kada je parametar metode split() regularni izraz, metod će na kraju izvršiti sledeći red koda:
return Pattern.compile(regex).split(this, limit);To znači da razdvajanje stringa dobija novu opciju — umesto metode split() klase String, možete direktno koristiti sledeći pristup.
public class TestPatternSplit {
private static Pattern twopart = Pattern.compile("\\.");
public static void main(String[] args) {
String [] parts = twopart.split("Chenmo Wang Er.jedan zabavan programer");
System.out.println("Prvi deo: " + parts[0] +" Drugi deo: " + parts[1]);
}
}"Pošto je obrazac utvrđen, funkcija statičke prethodne kompilacije može poboljšati efikasnost programa." rekoh. "Pored toga, možete koristiti Pattern u kombinaciji sa klasom Matcher za razdvajanje stringa. Prednost ovog pristupa je u tome što možete postaviti stroga ograničenja na string koji se razdvaja. Pogledajte ovaj primer koda."
public class TestPatternMatch {
/**
* Korišćenje funkcije prethodne kompilacije radi poboljšanja efikasnosti
*/
private static Pattern twopart = Pattern.compile("(.+)\\.(.+)");
public static void main(String[] args) {
checkString("Chenmo Wang Er.jedan zabavan programer");
checkString("Chenmo Wang Er.");
checkString(".jedan zabavan programer");
}
private static void checkString(String str) {
Matcher m = twopart.matcher(str);
if (m.matches()) {
System.out.println("Prvi deo: " + m.group(1) + " Drugi deo: " + m.group(2));
} else {
System.out.println("Nema poklapanja");
}
}
}Regularni izraz (.+)\\.(.+) znači da string ne treba samo razdvojiti na dva dela po tački, već i da ispred i iza tačke mora postojati sadržaj.
Pogledajmo izlaz programa:
Prvi deo: Chenmo Wang Er Drugi deo: jedan zabavan programer
Nema poklapanja
Nema poklapanjaMeđutim, korišćenje Matcher-a za poklapanje jednostavnih stringova je pomalo nezgrapno, pa korišćenje metode split() klase String i dalje ostaje prvi izbor, jer ova metoda poseduje i druge moćne mogućnosti. Na primer, ako želite da separator bude obuhvaćen prvim delom razdvojenog stringa, možete uraditi sledeće:
String cmower = "Chenmo Wang Er,jedan zabavan programer";
if (cmower.contains(",")) {
String [] parts = cmower.split("(?<=,)");
System.out.println("Prvi deo: " + parts[0] +" Drugi deo: " + parts[1]);
}Izlaz programa je sledeći:
Prvi deo: Chenmo Wang Er, Drugi deo: jedan zabavan programerVidimo da je separator "," obuhvaćen prvim delom. Ako biste želeli da bude obuhvaćen drugim delom, možete uraditi ovako:
String [] parts = cmower.split("(?=,)");"To su zapravo oblici tvrdnji (assertion) u regularnim izrazima." rekoh. "Kada budete imali vremena, možete pogledati one dve dokumentacije otvorenog koda koje sam malopre preporučio."

"Metoda split() može primiti 2 argumenta: prvi je separator, a drugi je broj delova na koje se string razdvaja." rekoh.
String cmower = "Chenmo Wang Er,jedan zabavan programer,voli ga";
if (cmower.contains(",")) {
String [] parts = cmower.split(",", 2);
System.out.println("Prvi deo: " + parts[0] +" Drugi deo: " + parts[1]);
}Ako uđete u debug režim, možete videti sledeće:

To znači da se, kada se proslede 2 argumenta, direktno poziva substring() za odsecanje, a nakon drugog separatora se više ne vrši razdvajanje.
Pogledajmo izlaz programa:
Prvi deo: Chenmo Wang Er Drugi deo: jedan zabavan programer,voli ga"Ne bih rekla — pa razdvajanje stringova je prilično ozbiljna stvar!"
"Jeste, razdvajanje stringova se u praksi prilično često koristi. Frontend često prema pravilima šalje jedan dugačak niz karaktera na backend, a backend onda mora da razdvoji string po pravilima i tek onda ga obradi." rekoh.
"Dobro, ponoviću današnji sadržaj. Erge, odmori se malo." reče
