Ce face [^...] (set negat)
Atunci când simbolul circumflex (^) este plasat chiar pe prima poziție în interiorul parantezelor drepte ([^...]), el inversează (neagă) setul de caractere: expresia va potrivi orice caracter care nu este listat în paranteze.
Seturile negate sunt extrem de utile și rapide pentru a extrage textul până la un anumit delimitator (de exemplu "[^"]*" pentru un șir între ghilimele sau [^,]+ pentru valorile dintr-un rând CSV), evitând problemele de performanță (catastrophic backtracking) ale lui .*?. Notă importantă: un set negat precum [^a] potrivește inclusiv caracterul de linie nouă (\n) și cere obligatoriu prezența unui caracter!
Variante și sintaxă asociată
| Expresie / Simbol | Descriere |
|---|---|
[^abc] |
Orice caracter în afară de a, b sau c (inclusiv spații și \n). |
[^0-9] |
Orice caracter care nu este cifră (echivalent cu \D). |
[^"\r\n]+ |
Unul sau mai multe caractere care nu sunt ghilimele și nu trec pe linie nouă. |
<[^>]+> |
Potrivește un tag HTML simplu de la < până la primul > întâlnit. |
[a^b] |
Dacă ^ NU este primul caracter din paranteze, este tratat ca simbol ^ literal. |
Exemple
Exemplul 1: Extragerea textului dintre ghilimele cu „[^”]*”
Folosind [^"]* în loc de .*, ne asigurăm că potrivirea se oprește exact la ghilimeaua de închidere.
Expresie: /"[^"]*"/g
Text: ' utilizatorul "alex_pop" a trimis mesajul "Salutare tuturor!" '
Potriviri găsite (Matches)
Match 1: "\"alex_pop\""
Match 2: "\"Salutare tuturor!\""
Exemplul 2: Eliminarea caracterelor nepermise dintr-un username
Păstrăm doar litere, cifre, punct și underscore înlocuind tot ce potrivește [^a-zA-Z0-9._].
// PHP:
$input = "ion.popescu!@# 2026$";
$username = preg_replace('/[^a-zA-Z0-9._]+/', '', $input);
Potriviri găsite (Matches)
"ion.popescu2026"
Greșeli frecvente
- Confuzia între
^la începutul expresiei (ancoră pentru începutul șirului, ex.^[abc]) și^în interiorul parantezelor (set negat, ex.[^abc]). - Presupunerea că
q[^u]va potrivi literaqla finalul cuvântuluiIraq:[^u]cere obligatoriu existența unui caracter dupăqcare să nu fieu. Pentru „qneurmat deuchiar și la final de cuvânt”, folosește negative lookahead:q(?!u).
Simboluri și rețete înrudite
[abc] și [a-z0-9] (seturi și intervale): Definește o clasă personalizată de caractere din care se potrivește un singur caracter.^ și $ (început și sfârșit de șir / linie): Ancorează potrivirea la începutul (^) și/sau la sfârșitul ($) șirului de text sau al fiecărui rând.Greedy vs Lazy (*?, +?, ??): Controlează dacă un cuantificator consumă cât mai mult text posibil (greedy) sau cât mai puțin (lazy / non-greedy).(?=...) și (?!...) (Positive / Negative Lookahead): Verifică dacă poziția curentă este urmată (?=…) sau NU este urmată (?!…) de un anumit șablon, fără a consuma caracterele.