Pattern.split în Java

Expresii regulate (Pattern și Matcher) Java 1.4 (splitAsStream: Java 8)

Împarte un text în bucăți acolo unde se potrivește modelul (ex. virgulă cu spații în jur) și returnează un tablou.

Sintaxă
String[] split(CharSequence text)
String[] split(CharSequence text, int limita)
Stream<String> splitAsStream(CharSequence text)

Ce face Pattern.split

pattern.split(text) taie textul în fiecare loc unde se potrivește modelul și returnează bucățile dintre ele. Cu un model ca \s*[,;]\s* împarți după virgulă sau punct și virgulă, eliminând și spațiile din jur.

Bucățile goale de la sfârșit sunt eliminate. Cu limita controlezi numărul maxim de bucăți (ultima conține tot restul); o limită negativă păstrează și bucățile goale de la sfârșit. splitAsStream dă bucățile ca Stream<String>.

String.split(regex) face același lucru, dar compilează modelul la fiecare apel. Dacă împarți multe rânduri, păstrează un Pattern.

Parametri

Parametru Descriere
text Textul împărțit.
limita Opțional: numărul maxim de bucăți (0 = toate, fără cele goale de la final).

Ce returnează

Un String[] cu bucățile (sau un Stream la splitAsStream).

Exemple

Exemplul 1: Separatori diferiți și spații în plus

import java.util.Arrays;
import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        Pattern separator = Pattern.compile("\\s*[,;]\\s*");
        String orase = "Iași ,Cluj;  Brașov , Sibiu;Arad";
        System.out.println(Arrays.toString(separator.split(orase)));

        System.out.println(Arrays.toString(separator.split("a,b,,c,,")));
        System.out.println(Arrays.toString(separator.split("a,b,,c,,", -1)));
        System.out.println(Arrays.toString(separator.split("nume, prenume, adresa completă", 2)));
    }
}

Rezultat

[Iași, Cluj, Brașov, Sibiu, Arad]
[a, b, , c]
[a, b, , c, , ]
[nume, prenume, adresa completă]

Exemplul 2: splitAsStream: cuvintele unui text

import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        Pattern spatii = Pattern.compile("\\W+", Pattern.UNICODE_CHARACTER_CLASS);
        String text = "Ce frumos e în munți, la Sinaia!";
        spatii.splitAsStream(text)
                .filter(c -> c.length() > 2)
                .map(String::toLowerCase)
                .forEach(System.out::println);
    }
}

Rezultat

frumos
munți
sinaia

Greșeli frecvente

  • Împarți după "." sau "|" și primești bucăți ciudate: sunt caractere speciale în regex. Folosește Pattern.quote(".") sau "\\.".
  • Te aștepți să păstrezi câmpurile goale de la sfârșitul unui rând CSV. Dă limita -1.

Comenzi înrudite

  • Pattern: O expresie regulată compilată; compile o pregătește o dată, matcher o aplică pe un text ca să cauți potriviri.
  • Pattern.quote: Transformă un text într-un model care se potrivește exact cu el, chiar dacă are caractere speciale (. * + ? |).
  • String.split: Împarte șirul în bucăți după un separator (expresie regulată) și returnează un array de String.
  • Stream.filter: Păstrează în stream doar elementele care îndeplinesc o condiție.