RegExp în Dart

O expresie regulată: un model de text cu care cauți, verifici sau înlocuiești bucăți dintr-un text.

Sintaxă
RegExp(String source, {bool multiLine = false, bool caseSensitive = true,
    bool unicode = false, bool dotAll = false})
String get pattern

Ce face RegExp

RegExp descrie un model de text: „una sau mai multe cifre” (\d+), „un cuvânt care începe cu literă mare” ([A-Z]\w*), „o adresă de email”. Sintaxa este cea din JavaScript. Scrie modelul ca text brut, cu r în față (RegExp(r'\d+')), ca să nu dublezi fiecare \.

Opțiunile se dau la creare: caseSensitive: false ignoră diferența dintre litere mari și mici, multiLine: true face ca ^ și $ să se potrivească la fiecare rând, dotAll: true face ca . să includă și rândul nou, iar unicode: true activează sintaxa Unicode (de exemplu \p{L} pentru orice literă). Proprietatea pattern returnează textul modelului.

Cu un RegExp poți verifica un text (hasMatch), găsi prima potrivire (firstMatch) sau toate (allMatches). Metodele lui String (split, replaceAll, contains) acceptă și ele un RegExp. Creează expresia o singură dată (de exemplu ca variabilă final) dacă o folosești în buclă.

Parametri

Parametru Descriere
source Modelul, ca text.
caseSensitive false ignoră literele mari/mici.
multiLine ^ și $ la fiecare rând.
unicode, dotAll Mod Unicode; . include rândul nou.

Ce returnează

Un obiect RegExp. pattern: un String.

Exemple

Exemplul 1: Crearea și folosirea unei expresii

void main() {
  final cifre = RegExp(r'\d+');
  print(cifre.pattern);
  print(cifre.hasMatch('Camera 12'));
  print('Bloc 4, scara B, ap. 27'.replaceAll(cifre, '#'));
  print('Ana,  Mihai;Ioana'.split(RegExp(r'[,;]\s*')));

  final oras = RegExp(r'^iași$', caseSensitive: false);
  print(oras.hasMatch('IAȘI'));
  print(oras.isCaseSensitive);
}

Rezultat

\d+
true
Bloc #, scara B, ap. #
[Ana, Mihai, Ioana]
true
false

Exemplul 2: multiLine și unicode

Fără multiLine, ^ se potrivește doar la începutul întregului text. \p{L} (orice literă, inclusiv ă, ș, ț) cere unicode: true.

void main() {
  var text = 'Ana: 9\nMihai: 7\nIoana: 10';
  var nume = RegExp(r'^\w+');
  print(nume.allMatches(text).map((m) => m[0]).toList());
  var numeMulti = RegExp(r'^\w+', multiLine: true);
  print(numeMulti.allMatches(text).map((m) => m[0]).toList());

  var cuvinte = RegExp(r'\p{L}+', unicode: true);
  print(cuvinte.allMatches('Știință și țară').map((m) => m[0]).toList());
  print(RegExp(r'\w+').allMatches('Știință și țară').map((m) => m[0]).toList());
}

Rezultat

[Ana]
[Ana, Mihai, Ioana]
[Știință, și, țară]
[tiin, i, ar]

Greșeli frecvente

  • Scrii modelul fără r: RegExp('\d+'). În textul normal \d nu este o secvență validă; folosește r'\d+'.
  • Folosești \w pentru cuvinte românești. \w înseamnă doar [A-Za-z0-9_]: „Știință” se rupe în bucăți. Folosește \p{L} cu unicode: true.
  • Uiți să scapi caracterele speciale (., +, () din textul căutat. Folosește RegExp.escape.

Comenzi înrudite

  • RegExp.hasMatch: hasMatch spune dacă modelul apare în text; stringMatch returnează textul primei potriviri sau null.
  • RegExp.firstMatch: Caută prima potrivire a modelului în text și o returnează cu poziții și grupuri, sau null dacă nu există.
  • RegExp.allMatches: Returnează toate potrivirile modelului în text, ca o colecție de obiecte RegExpMatch.
  • RegExpMatch: Rezultatul unei căutări cu RegExp: textul găsit, grupurile din paranteze și pozițiile de început și sfârșit.
  • String.replaceAll: Înlocuiește toate aparițiile (replaceAll) sau doar prima (replaceFirst) unui text; replaceAllMapped calculează înlocuirea.