RegEx în JavaScript, PHP (preg_match) și Python (re) în Expresii Regulare (RegEx)

Rețete practice și utilizare în limbaje JS ES6+ / PHP 7.4-8.x / Python 3

Ghid comparativ pentru apelarea expresiilor regulare în cele mai populare 3 limbaje: testare, extragere, înlocuire și split.

Tipar RegEx
str.match(/.../g)   |   preg_match('/.../', $s, $m)   |   re.findall(r"...", s)

Ce face RegEx în JavaScript, PHP (preg_match) și Python (re)

Deși sintaxa expresiilor regulare este aproape identică între JavaScript, PHP și Python, funcțiile prin care le apelezi și modul în care sunt scrise șirurile diferă de la un limbaj la altul.

În JavaScript, expresiile se scriu direct ca literali între slash-uri (/\d+/g, fără ghilimele). În PHP, funcțiile PCRE (preg_match, preg_match_all, preg_replace) primesc expresia ca șir de caractere cu delimitatori (ex. '/\d+/' sau '~https?://~'). În Python (modulul re), expresia se scrie ca raw string (r"\d+") fără delimitatori /.

Variante și sintaxă asociată

Expresie / Simbol Descriere
Verificare (boolean) JS: /re/.test(str) | PHP: preg_match(‘/re/’, $str) === 1 | Python: bool(re.search(r”re”, str))
Prima potrivire + grupuri JS: str.match(/re/) | PHP: preg_match(‘/re/’, $str, $m) | Python: m = re.search(r”re”, str)
Toate potrivirile (global) JS: […str.matchAll(/re/g)] | PHP: preg_match_all(‘/re/’, $str, $m) | Python: re.findall(r”re”, str)
Înlocuire (Replace) JS: str.replace(/re/g, „$1″) | PHP: preg_replace(‘/re/’, ‘$1’, $str) | Python: re.sub(r”re”, r”\1″, str)
Împărțire (Split) JS: str.split(/re/) | PHP: preg_split(‘/re/’, $str) | Python: re.split(r”re”, str)

Exemple

Exemplul 1: Același task în JavaScript, PHP și Python: extragerea prețurilor și replace

Vezi în paralel cum se testează, se extrag grupuri și se înlocuiește textul în cele trei limbaje.

// ================= 1. JAVASCRIPT =================
const text = "Produs A: 120 RON, Produs B: 85 RON";
const isValid = /\d+\s*RON/.test(text);               // true
const toate   = text.match(/\d+(?=\s*RON)/g);         // ["120", "85"]
const euro    = text.replace(/(\d+)\s*RON/g, "$1 EUR");

// ================= 2. PHP (PCRE) =================
$text = "Produs A: 120 RON, Produs B: 85 RON";
$isValid = (bool) preg_match('/\d+\s*RON/', $text);   // true
preg_match_all('/\d+(?=\s*RON)/', $text, $m);         // $m[0] = ["120", "85"]
$euro = preg_replace('/(\d+)\s*RON/', '$1 EUR', $text);

// ================= 3. PYTHON 3 (re) ==============
import re
text = "Produs A: 120 RON, Produs B: 85 RON"
is_valid = bool(re.search(r"\d+\s*RON", text))        # True
toate    = re.findall(r"\d+(?=\s*RON)", text)         # ['120', '85']
euro     = re.sub(r"(\d+)\s*RON", r"\1 EUR", text)

Potriviri găsite (Matches)

Rezultatul variabilei euro în toate cele 3 limbaje:
"Produs A: 120 EUR, Produs B: 85 EUR"

Exemplul 2: Alegerea unui delimitator alternativ (~ sau #) în PHP pentru URL-uri și căi

În PHP nu ești obligat să folosești /.../: dacă expresia conține slash-uri /, folosește ~...~ sau #...# ca să nu mai escapezi fiecare \/!

// PHP - cu delimitatorul / trebuie să escapăm fiecare slash:
preg_match('/^https:\/\/www\.dexblog\.ro\/invata\/([a-z0-9-]+)\/$/', $url, $m);

// PHP - cu delimitatorul ~ expresia este mult mai curată:
preg_match('~^https://www\.dexblog\.ro/invata/([a-z0-9-]+)/$~', $url, $m);

Potriviri găsite (Matches)

Ambele expresii sunt 100% echivalente în PHP, dar varianta cu ~...~ evită "leaning toothpick syndrome" (\/\/\/).

Greșeli frecvente

  • În Python, diferența dintre re.match() și re.search(): re.match() verifică doar la începutul șirului (ca și cum ar avea ^ invizibil în față), în timp ce re.search() caută oriunde în șir (comportamentul standard din JS și PHP)!
  • În JavaScript, dacă folosești str.match(/.../g) cu flag-ul g, metoda returnează doar potrivirile întregi și ignoră grupurile de captură! Pentru a obține și grupurile de captură pentru toate aparițiile în JS, folosește str.matchAll(/.../g).
  • În PHP, preg_match() returnează 1 (int) la potrivire, 0 când nu găsește nimic și false la eroare de sintaxă. Verifică cu preg_match(...) === 1 în condițiile stricte.

Simboluri și rețete înrudite

  • Flag-uri RegEx: g, i, m, s, u, x: Modificatori globali care schimbă modul de evaluare a expresiei: căutare multiplă (g), insensibil la majuscule (i), multi-linie (m), Unicode (u).
  • \ (escaparea caracterelor speciale): Anulează rolul special al metacaracterelor RegEx (. + * ? ^ $ ( ) [ ] { } | \) pentru a le căuta ca text literal.
  • (...) (grup de captură): Grupează mai multe elemente într-o singură unitate și salvează (capturează) subșirul potrivit pentru extragere sau înlocuire.
  • (?<nume>...) (grup cu nume): Asociază un nume descriptiv unui grup de captură pentru a accesa valoarea extrasă după cheie, nu doar după număr.