==== Expresii regulate ==== O expresie regulată este un șir de caractere care conține niște reguli speciale, comportându-se ca un șablon pentru căutarea/potrivirea unor porțiuni dintr-un text. ==== Abrevieri de caractere ==== ^Expresie^Descriere^ |**c**|un caracter, atâta timp cât acesta nu are o altă semnificație în expresiile regulate| |**\c**|caută o potrivire cu caracterul care urmează semnului '\'. Util pentru a căuta caractere care singure au un rol special (ex. '.', '?'...)| |**\a**|caracterul chr(7)| |**\f**|caracterul chr(12)| |**\n**|caracterul de linie nouă chr(10)| |**\r**|caracterul chr(13)| |**\t**|caracterul tabulator chr(9)| |**\v**|caracterul chr(11)| |**\xhhhh**|un caracter Unicode cu codul exprimat în sistemul hexazecimal cu numărul hhhh (între 0x0000 și 0xFFFF)| |**\0ooo**|un caracter ASCII/Latin1 având codul exprimat în sistemul octal ooo (între 0 și 0377)| |**.** (punct)|orice caracter, inclusiv caracterul linie nouă| |**\d**|o cifră| |**\D**|un caracter care nu este o cifră| |**\s**|un caracter de spațiere| |**\S**|un caracter care nu este unul de spațiere| |**\w**|o cifră, o literă sau caracterul '_'| |**\W**|un caracter care nu este o cifră, o literă sau caracterul '_'| |**\1 \2 ... \9**|referință din urmă (același text capturat de ultimul grup de capturare)| ==== Seturi de caractere ==== Parantezele pătrate înseamnă potrivirea oricărui caracter dintre parantezele pătrate. Cu excepția abrevierilor de caractere descrise mai sus și a următoarelor două excepții, alte caractere nu au înțelesuri speciale între paranteze pătrate:\\ * caracterul minus/cratimă '-' definește un interval\\ * caracterul '^' poziționat imediat după deschiderea parantezei drepte înseamnă negarea conținutului dintre paranteze. ^Exemplu de expresie regulată^Descriere^ |**[xyz]**|se potrivește cu oricare din caracterele 'x', 'y' sau 'z'| |**[^xyz]**|se potrivește cu orice caracter, cu excepția caracterelor 'x', 'y' și 'z'| |**[a-g]**|se potrivește cu orice caracter din intervalul dintre 'a' și 'g'| |**[0-9a-zA-Z_]**|se potrivește cu orice cifră între '0' și '9', orice caracter între 'a' și 'z' și între 'A' și 'Z', sau se potrivește cu caracterul '_'| Folosirea abrevierilor de caractere predefinite este mai portabilă decât utilizarea intervalelor de caractere între platforme și limbi. De exemplu, **[0-9]** se potrivește cu o cifră în alfabete occidentale, dar **\d** se potrivește cu o cifră din //orice// alfabet. ==== Cuantificatori ==== În mod implicit, o expresie este așteptată să apară o singură dată. Acest lucru poate fi schimbat cu ajutorul cuantificatorilor: ^Expresie^Descriere^Expresie regulată^Potriviri^Echivalent cu^ |**?**|una sau nicio apariție|"maci?"|"mac", "maci"|{0,1}| |**+**|una sau mai multe apariții|"0+"|"0", "00", "000" etc.|{1,}| |*****|zero sau mai multe apariții|"0*123"|"123", "0123", "00123", "000123" etc.|{0,}| |**{n}**|un număr de n apariții|"x{5}"|"xxxxx"|{n,n}| |**{n,}**|cel puțin n apariții| | | | |**{,m}**|cel mult m apariții| | |{0,m}| |**{n,m}**|cel puțin n apariții și cel mult m apariții| | | | Cuantificatorii sunt în mod normal "lacomi". Ei încearcă să potrivească întotdeauna cât mai mult text posibil. Comportamentul poate fi schimbat cu ajutorul instrucțiunii [[regexminimal|RegExMinimal]]. ==== Grupuri de capturare ==== Parantezele rotunde permit să se grupeze elemente împreună pentru a le putea cuantifica și captura.\\ De exemplu, dacă se folosește expresia regulară "**roșu|alb|galben**", atunci va fi capturată doar prima valoare întâlnită dintre cele trei. Dacă se folosesc parantezele rotunde, acestea permit gruparea elementelor. De exemplu expresia "**steag (roșu|alb|galben)**" va captura una dintre valorile: "steag roșu", "steag alb" sau "steag galben". Dacă nu s-ar fi folosit parantezele pentru grupare și s-ar fi folosit expresia regulară "**steag roșu|alb|galben**" atunci s-ar fi căutat doar valorile "steag roșu", "alb" sau "galben". Grupurile de captură permit și cuantificarea conținutului lor. De exemplu expresia "**(bla)+**" va captura oricâte serii consecutive de "bla", dar nu mai puțin de una (vezi cuantificatorul **+**). Texte care se potrivesc acestei expresii pot fi: "bla", "blabla", "blablablablabla" etc. Grupurile de captură permit utilizarea referințelor. O expresie regulată poate face referire la un grup de captură din cadrul expresiei folosind o referință. Se pot folosi până la 9 referințe, unde **\1** este primul grup de captură din expresie, **\2** este al doilea, **\3** este al treilea ș.a.m.d.\\ De exemplu, expresia **\b(\w+)\W+\1\b** poate fi folosită în găsirea cuvintelor repetate unul după altul. **\b** reprezintă existența unei limite de cuvânt (din engleză boundary = limită), adică tocmai începe sau se termină un cuvânt format din caractere alfanumerice. Apoi urmează un grup de captură **(\w+)** care va potrivi cât mai multe caractere alfanumerice consecutive (cel puțin un caracter), apoi urmează unul sau mai multe caractere care nu sunt alfanumerice **\W+**, urmate imediat de o referință **\1**. Aceasta face referire la textul rezultat din aplicarea primului grup de capturare din expresie (**(\w+)**). Această expresie va potrivi cuvintele dublate dintr-un text, cum ar fi: "nu știu **dar dar** am să învăț", sau "morcov **și și** țelină". Dacă se dorește doar gruparea, fără capturare în vederea realizării unei referințe ulterioare, de exemplu, atunci se poate folosi o sintaxă precum: **(?:roșu|alb)**. Grupurile, de orice fel, pot fi imbricate (să fie incluse unele în altele). ==== Aserțiuni ==== Aserțiunile fac o declarație despre text în punctul în care acestea apar în expresie, dar nu se potrivesc cu niciun caracter. ^Expresie^Descriere^ |**^**|semnifică începutul șirului de caractere în care se caută. De exemplu expresia "**^Așadar"** se va potrivi doar în cazul în care cuvântul "Așadar se află la începutul textului de căutat. Dacă se dorește căutarea simbolului '//^//' atunci se poate folosi "**\^**"| |**$**|semnifică sfârșitul șirului de caractere în care se caută. De exemplu expresia "**\s+$**" va potrivi doar caracterele de spațiere aflate la sfârșitul textului.| |**\b**|semnifică o limită a unui cuvânt. Adică fie începe un cuvânt, fie se termină. Expresia "**\bcine\b**" se va potrivi doar cu cuvântul "cine", pe când "**\bcine**" se va potrivi cu orice cuvânt care începe cu "cine" precum "cinema" sau "cineva". În mod asemănător, expresia "**cine\b**" se va potrivi cu sfârșitul unor cuvinte precum "oricine" sau "mărăcine"| |**\B**|semnifică faptul că acolo nu este vorba de o limită a unui cuvânt. De exemplu expresia "**\Bcine\B**" se va potrivi doar în cazul în care "cine" se află în mijlocul unui cuvânt. **\B** este inversul expresiei **\b**.| |**(?=...)**|potrivește doar dacă expresia există, fără să o captureze. De exemplu expresia **număr(?=\s+întreg\b)** se va potrivi cu "număr" doar dacă este urmat de cuvântul "întreg".| |**(?!...)**|potrivește doar dacă expresia nu există, fără să o captureze. De exemplu expresia **număr(?!\s+real\b)** se va potrivi cu "număr" doar dacă nu este urmat de cuvântul "real".|