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\dnu este o secvență validă; foloseșter'\d+'. - Folosești
\wpentru cuvinte românești.\wînseamnă doar[A-Za-z0-9_]: „Știință” se rupe în bucăți. Folosește\p{L}cuunicode: true. - Uiți să scapi caracterele speciale (
.,+,() din textul căutat. FoloseșteRegExp.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.