String.splitMapJoin în Dart

Împarte textul în potriviri și bucăți dintre ele, le transformă separat și le lipește la loc.

Sintaxă
String splitMapJoin(Pattern pattern,
    {String Function(Match)? onMatch, String Function(String)? onNonMatch})

Ce face String.splitMapJoin

splitMapJoin face trei lucruri dintr-o dată. Taie textul în bucățile care se potrivesc cu modelul și cele dintre ele. Transformă potrivirile cu onMatch și restul cu onNonMatch. Apoi lipește totul la loc, în aceeași ordine.

Ambele funcții sunt opționale. Dacă lipsește onMatch, potrivirea rămâne cum este; dacă lipsește onNonMatch, textul dintre potriviri rămâne neschimbat. onMatch primește un Match (cu grupuri, dacă modelul este o RegExp), iar onNonMatch primește bucata de text.

Este potrivit când vrei să tratezi diferit două feluri de text, de exemplu să evidențiezi numerele și să scrii restul cu litere mari. Dacă vrei să schimbi doar potrivirile, replaceAllMapped este mai simplu.

Parametri

Parametru Descriere
pattern Modelul căutat (text sau RegExp).
onMatch Transformă fiecare potrivire.
onNonMatch Transformă fiecare bucată dintre potriviri.

Ce returnează

Un String nou.

Exemple

Exemplul 1: Evidențierea numerelor

void main() {
  var text = 'Ana are 3 mere și 12 pere';
  var rezultat = text.splitMapJoin(
    RegExp(r'\d+'),
    onMatch: (m) => '[${m[0]}]',
    onNonMatch: (s) => s.toUpperCase(),
  );
  print(rezultat);
}

Rezultat

ANA ARE [3] MERE ȘI [12] PERE

Exemplul 2: Marcarea unui cuvânt căutat în HTML

Cuvântul găsit este pus în <mark>, iar restul textului este „scăpat” pentru HTML.

String escape(String s) => s.replaceAll('&', '&amp;').replaceAll('<', '&lt;').replaceAll('>', '&gt;');

void main() {
  var text = 'Iași <capitala Moldovei> & Iași-ul vechi';
  print(text.splitMapJoin(
    'Iași',
    onMatch: (m) => '<mark>${m[0]}</mark>',
    onNonMatch: escape,
  ));
}

Rezultat

<mark>Iași</mark> &lt;capitala Moldovei&gt; &amp; <mark>Iași</mark>-ul vechi

Greșeli frecvente

  • Te aștepți ca splitMapJoin să returneze o listă, ca split. Returnează un singur text, deja lipit.

Comenzi înrudite

  • String.split: Împarte textul în bucăți la fiecare apariție a separatorului și returnează o listă de texte.
  • String.replaceAll: Înlocuiește toate aparițiile (replaceAll) sau doar prima (replaceFirst) unui text; replaceAllMapped calculează înlocuirea.
  • RegExp: O expresie regulată: un model de text cu care cauți, verifici sau înlocuiești bucăți dintr-un text.