RegExpMatch în Dart

Text (String, StringBuffer, RegExp) Dart 2.3 (Match: Dart 1.0)

Rezultatul unei căutări cu RegExp: textul găsit, grupurile din paranteze și pozițiile de început și sfârșit.

Sintaxă
abstract interface class RegExpMatch implements Match
String? group(int group)     // la fel: match[group]
int get groupCount
int get start
int get end

Ce face RegExpMatch

Un RegExpMatch este o potrivire găsită de firstMatch sau allMatches. group(0) (sau m[0]) este tot textul găsit. group(1), group(2)… sunt bucățile prinse de parantezele din model, numărate de la stânga după paranteza care se deschide.

groupCount spune câte grupuri are modelul (fără grupul 0). Un grup care nu a participat la potrivire (de exemplu unul opțional, (...)?) are valoarea null. Un număr mai mare decât groupCount aruncă RangeError.

start este poziția primului caracter găsit, iar end poziția de după ultimul, deci text.substring(m.start, m.end) == m[0]. Grupurile cu nume se citesc cu namedGroup. Există și groups([1, 2]), care returnează mai multe grupuri ca listă.

Parametri

Parametru Descriere
group Numărul grupului: 0 pentru tot textul, 1..groupCount pentru paranteze.

Ce returnează

group: un String?. groupCount, start, end: int.

Exemple

Exemplul 1: Grupuri și poziții

void main() {
  final ora = RegExp(r'(\d{2}):(\d{2})(:(\d{2}))?');
  var text = 'Trenul pleacă la 14:35 din Iași.';
  var m = ora.firstMatch(text)!;
  print(m.group(0));
  print(m.groupCount);
  print('ora ${m.group(1)}, minutul ${m[2]}');
  print(m[4]);
  print('${m.start}-${m.end}: ${text.substring(m.start, m.end)}');
  print(m.groups([1, 2]));
}

Rezultat

14:35
4
ora 14, minutul 35
null
17-22: 14:35
[14, 35]

Exemplul 2: Program de tren

void main() {
  final rand = RegExp(r'(\w+)\s+(\d{2}:\d{2})\s+(\d+) lei');
  var orar = '''
Suceava 06:10 45 lei
Bacau   08:25 38 lei
Brasov  11:40 72 lei''';
  for (var m in rand.allMatches(orar)) {
    print('${m[1]!.padRight(8)} la ${m[2]}, bilet ${m[3]} lei');
  }
}

Rezultat

Suceava  la 06:10, bilet 45 lei
Bacau    la 08:25, bilet 38 lei
Brasov   la 11:40, bilet 72 lei

Greșeli frecvente

  • Numeri grupurile de la 0. Grupul 0 este tot textul găsit; primul grup din paranteze este group(1).
  • Crezi că end este poziția ultimului caracter. Este poziția de după el, la fel ca la substring.

Comenzi înrudite

  • RegExpMatch.namedGroup: Returnează textul prins de un grup cu nume, scris în model ca (?<nume>…).
  • 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.