Java – Le novità di Matcher in Java 9

Quando nel 2017 era uscito Java 9, ero rimasto molto incuriosito da alcune novità che erano state introdotte nella classe java.util.regex.Matcher, relativa alle “espressioni regolari”. In particolare avevo notato l’aggiunta di diversi nuovi metodi che si possono grosso modo suddividere in 3 gruppi:

  1. public Matcher appendReplacement(StringBuilder sb, String replacement)
    public StringBuilder appendTail(StringBuilder sb)

  2. public String replaceFirst(Function<MatchResult,String> replacer)
    public String replaceAll(Function<MatchResult,String> replacer)

  3. public Stream<MatchResult> results()

Cosa significano questi nuovi metodi? Se escludiamo solo per un momento appendReplacement e appendTail, significano che da Java 9 è possibile (finalmente!) operare sui risultati di “match” delle espressioni regolari in una maniera più “funzionale” sfruttando le functional interface e anche la Stream API (entrambe sono novità di Java 8) tramite il nuovo metodo results.

Per descrivere in dettaglio i nuovi metodi elencati prima, ho deciso di creare una serie di 3 ulteriori articoli per rendere la trattazione più agevole. I prossimi articoli di questa serie saranno quindi in sequenza:

Prima di concludere ci sono soltanto due note da fare:

Nota 1: il consiglio è di leggere le successive parti in sequenza, in particolare prima la parte 2 e poi la parte 3 perché c’è una sequenzialità tra i due articoli. La parte 4 (sul nuovo metodo results) invece ha solo una leggera correlazione con la parte 3 per via della interfaccia MatchResult.

Nota 2: per seguire le altre parti è necessario avere una discreta conoscenza delle “espressioni regolari”. Negli esempi che mostrerò verranno usati pochi costrutti tra cui \d (una cifra decimale), i quantificatori {n} e {n,m} e in particolare anche i “gruppi” e i back-reference. Ma non serve avere una conoscenza davvero “avanzata”. Inoltre serve una conoscenza anche minima delle novità di Java 8, tra cui lambda expression (almeno l’uso basilare), functional interface (almeno java.util.function.Function) e infine, specificatamente solo per la parte 4, anche la Stream API.