Pattern în Dart

Interfața comună pentru String și RegExp: orice lucru care poate fi căutat într-un text.

Sintaxă
abstract interface class Pattern
Iterable<Match> allMatches(String string, [int start = 0])
Match? matchAsPrefix(String string, [int start = 0])

Ce face Pattern

Pattern este interfața implementată de String și RegExp. Metodele de text care primesc un Pattern (split, contains, replaceAll, indexOf, startsWith) acceptă deci ori un text simplu, ori o expresie regulată.

Are două metode: allMatches, care găsește toate potrivirile, și matchAsPrefix(text, start), care verifică dacă modelul se potrivește exact la poziția start (nu oriunde după ea) și returnează potrivirea sau null.

Poți scrie și tu funcții care primesc Pattern, ca să accepte ambele forme. Rareori ai nevoie să implementezi interfața într-o clasă proprie.

Exemple

Exemplul 1: Același cod pentru String și RegExp

int numara(String text, Pattern ce) => ce.allMatches(text).length;

void main() {
  var text = 'Ana are 3 mere, Ioana are 12 pere';
  print(numara(text, 'are'));
  print(numara(text, RegExp(r'\d+')));
  print(text.split(RegExp(r',\s*')));
  print(text.split(', '));
  Pattern p = 'Ana';
  print(p is String);
}

Rezultat

2
2
[Ana are 3 mere, Ioana are 12 pere]
[Ana are 3 mere, Ioana are 12 pere]
true

Exemplul 2: matchAsPrefix: potrivire la o poziție exactă

Un mic analizor citește pe rând numere și operatori, verificând ce se află exact la poziția curentă.

void main() {
  final numar = RegExp(r'\d+');
  final operator = RegExp(r'[+\-*/]');
  var expresie = '12+7*30';
  var poz = 0;
  var bucati = <String>[];
  while (poz < expresie.length) {
    var m = numar.matchAsPrefix(expresie, poz) ?? operator.matchAsPrefix(expresie, poz);
    if (m == null) break;
    bucati.add(m[0]!);
    poz = m.end;
  }
  print(bucati);
  print(numar.matchAsPrefix('a12'));
  print('Iași'.matchAsPrefix('Iași, România')?.end);
}

Rezultat

[12, +, 7, *, 30]
null
4

Greșeli frecvente

  • Folosești matchAsPrefix și te aștepți să caute mai departe în text, ca firstMatch. Verifică doar poziția dată.

Comenzi înrudite

  • RegExp: O expresie regulată: un model de text cu care cauți, verifici sau înlocuiești bucăți dintr-un text.
  • String.allMatches: Găsește toate aparițiile unui text în alt text și le returnează ca obiecte Match, cu poziții.
  • String.split: Împarte textul în bucăți la fiecare apariție a separatorului și returnează o listă de texte.