Aceasta este o pagină de referință – nu vă simțiți obligat să o citiți, deoarece este destul de laconică. Alte secțiuni fac trimitere la ea atunci când este nevoie.
Modificatorii Regex apar la fiecare colț pe acest site. Decât să explic în mod repetat ce fac și multiplele moduri de a le activa în fiecare aromă de regex, am decis să le adun pe cele patru comune (i, s, m și x) într-un singur loc. Ultima secțiune analizează pe scurt alți modificatori, care sunt de obicei specifici unei limbi.
Puncte de salt
Pentru o navigare ușoară, iată câteva puncte de salt către diverse secțiuni ale paginii:
✽ Insensibilitate la majuscule: i
✽ DOTALL (Dot Matches Line Breaks): s (cu excepția Ruby și JavaScript)
✽ Multiline (^ și $ Match on Every Line): m (cu excepția Ruby)
✽ Spațiere liberă: x (cu excepția JavaScript)
✽ Alți modificatori
✽ Modificatori speciali de început de model PCRE
(legătură directă)

Insensibilitate la majuscule și minuscule: i

În mod implicit, toate motoarele regex majore se potrivesc în mod sensibil la majuscule și minuscule. Dacă doriți ca modele cum ar fi Name: + să se potrivească în mod insensibil la majuscule și minuscule, trebuie să activăm această caracteristică.
Da, dar…
Ce înseamnă cu adevărat insensibil la majuscule?
Atâta timp cât vă limitați la cele 26 de litere ale alfabetului englezesc, definiția majusculelor și minusculelor este simplă. Atunci când vă ramificați în subtilități tipografice sau în alte limbi și scripturi, lucrurile nu sunt întotdeauna atât de simple. Iată câteva întrebări cu care s-ar putea să vă confruntați.
✽ Se va potrivi fl (un caracter, adică ligatura fl) cu FL?
✽ Se va potrivi à (un caracter) cu À?
✽ Se va potrivi à (două caractere, adică litera a și accentul grav) cu À? Toate motoarele par să gestioneze corect acest lucru.
✽ Se va potrivi ß cu ss? Niciun motor nu pare să facă acest lucru.
✽ Se va potrivi i cu İ (i majusculă turcească), precum și cu I?
Aceste întrebări sunt doar vârful icebergului. Chiar dacă aș ști toate răspunsurile, ar fi imposibil să le includ pe toate în această secțiune: dacă folosiți un anumit script, va trebui să cercetați modul în care motorul dvs. specific gestionează potrivirea insensibilă la majuscule și minuscule în scriptul respectiv.
Mai mult de o modalitate
Pentru mai multe motoare, rețineți că există două modalități de a activa potrivirea insensibilă la majuscule și minuscule: ca modificator inline (?i) sau ca o opțiune în metoda sau funcția regex.
Modificator inline (?i)
În .NET, PCRE (C, PHP, R…), Perl, Python, Java și Ruby (dar nu și în JavaScript), puteți utiliza modificatorul inline (?i), de exemplu în (?i)cat. Consultați secțiunea privind modificatorii inline pentru detalii suculente despre trei caracteristici suplimentare (indisponibile în Python): activarea acestuia în mijlocul șirului de caractere, dezactivarea lui cu (?-i) sau aplicarea lui doar la conținutul unui grup care nu este capturat cu (?i:foo)

.NET
Pe lângă modificatorul inline (?i), limbajele .NET dispun de opțiunea IgnoreCase. De exemplu, în C# puteți folosi:
var catRegex = new Regex("cat", RegexOptions.IgnoreCase);
Perl
În afară de modificatorul (?i) inline, Perl vă permite să adăugați stegulețul i după delimitatorul de închidere al modelului. De exemplu, puteți folosi:
if ($the_subject =~ m/cat/i) { … }
PCRE (C, PHP, R…)
Rețineți că, în PCRE, pentru a utiliza potrivirea insensibilă la majuscule și minuscule cu litere care nu sunt englezești și care nu fac parte din locale, va trebui să activați modul Unicode – de exemplu, cu modificatorul special de început de model (*UTF8).
Pe lângă indicatorul (?i) modificatorul inline, PCRE vă permite să setați modul PCRE_CASELESS atunci când apelați funcția pcre_compile() (sau o funcție similară):

cat_regex = pcre_compile( "cat", PCRE_CASELESS, &error, &erroroffset, NULL ); 

În PHP, opțiunea PCRE_CASELESS este transmisă prin intermediul indicatorului i, pe care îl puteți adăuga în șirul regex după delimitatorul de închidere. De exemplu, puteți folosi:
$cat_regex = '~cat~i';
În R, opțiunea PCRE_CASELESS este transmisă prin intermediul opțiunii ignore.case=TRUE. De exemplu, puteți utiliza:
grep("cat", subject, perl=TRUE, value=TRUE, ignore.case=TRUE);
Python
În afară de modificatorul inline (?i), Python dispune de opțiunea IGNORECASE. De exemplu, puteți utiliza:
cat_regex = re.compile("cat", re.IGNORECASE)
Java
Pe lângă modificatorul inline (?i), Java are opțiunea CASE_INSENSITIVE. De exemplu, puteți utiliza:

Pattern catRegex = Pattern.compile( "cat", Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE );

Opțiunea UNICODE_CASE adăugată aici asigură faptul că funcția de insensibilitate la majuscule și minuscule este compatibilă cu Unicode. Dacă lucrați doar cu ASCII, nu trebuie să o folosiți.
JavaScript
În JavaScript, singura opțiune este să adăugați stegulețul i după delimitatorul de închidere al modelului dvs. De exemplu, puteți folosi:
var catRegex = /cat/i;
Ruby
Pe lângă modificatorul inline (?i), Ruby vă permite să adăugați stegulețul i după delimitatorul de închidere al modelului. De exemplu, puteți utiliza:
cat_regex = /cat/i
(legătură directă)

DOTALL (Dot Matches Line Breaks): s (cu excepții)

În mod implicit, punctul . nu se potrivește cu caracterele de întrerupere a liniei, cum ar fi avansurile de linie și revenirile de cărămidă. Dacă doriți ca modele precum BEGIN .*? END să se potrivească de-a lungul liniilor, trebuie să activăm această caracteristică.
Acest mod este numit uneori single-line (de unde și s) deoarece, în ceea ce privește punctul, acesta transformă întregul șir de caractere într-o singură linie mare – .* se va potrivi de la primul până la ultimul caracter, indiferent de câte întreruperi de linie se află între ele.

Modul este, de asemenea, numit DOTALL în PCRE, Python și Java (pentru a fi mai precis, documentația PCRE folosește PCRE_DOTALL). Pentru mine, denumirea DOTALL este un mod sensibil de a numi acest mod. A treia opțiune dot-matches-line-breaks este descriptivă, dar un pic cam guraliv.
Pentru mai multe motoare, rețineți că există două moduri de a o activa: ca modificator inline sau ca opțiune în metoda sau funcția regex.
JavaScript
JavaScript nu acceptă modul cu o singură linie. Pentru a potrivi orice caracter din JavaScript, inclusiv pauzele de linie, utilizați o construcție precum . Această clasă de caractere se potrivește cu un caracter care este fie o cifră care nu este o cifră \D, fie o cifră \d. Prin urmare, se potrivește cu orice caracter.
O altă soluție JavaScript este utilizarea bibliotecii regex XRegExp. Dacă aveți timp infinit la dispoziție, puteți încerca, de asemenea, să portați PCRE în JavaScript folosind Emscripten, așa cum se pare că a făcut Firas pe regex 101.
Modificator inline (?s)
În .NET, PCRE (C, PHP, R…), Perl, Python și Java (dar nu și în Ruby), puteți folosi modificatorul inline (?s), de exemplu în (?s)BEGIN .*? END. Consultați secțiunea privind modificatorii inline pentru detalii suculente despre trei caracteristici suplimentare (indisponibile în Python): activarea acestuia în mijlocul șirului, dezactivarea lui cu (?-s) sau aplicarea lui numai la conținutul unui grup care nu este capturat cu (?s:foo)
.NET
Pe lângă modificatorul inline (?s), limbajele .NET dispun de opțiunea Singleline. De exemplu, în C# puteți folosi:

var blockRegex = new Regex( "BEGIN .*? END", RegexOptions.IgnoreCase | RegexOptions.Singleline );

Perl
În afară de modificatorul (?s) inline, Perl vă permite să adăugați steagul s după delimitatorul de închidere al modelului. De exemplu, puteți folosi:
if ($the_subject =~ m/BEGIN .*? END/s) { … }
PCRE (C, PHP, R…)
Pe lângă modificatorul inline (?s), PCRE vă permite să setați modul PCRE_DOTALL atunci când apelați funcția pcre_compile() (sau o funcție similară):

block_regex = pcre_compile( "BEGIN .*? END", PCRE_DOTALL, &error, &erroroffset, NULL ); 

În PHP, opțiunea PCRE_DOTALL este transmisă prin intermediul indicatorului s, pe care îl puteți adăuga în șirul regex după delimitatorul de închidere. De exemplu, puteți folosi:
$block_regex = '~BEGIN .*? END~s';
Python
În afară de modificatorul inline (?s), Python dispune de opțiunea DOTALL. De exemplu, puteți utiliza:
block_regex = re.compile("BEGIN .*? END", re.IGNORECASE | re.DOTALL)
Java

În afară de modificatorul (?s) inline, Java are opțiunea DOTALL. De exemplu, puteți folosi:

Pattern blockRegex = Pattern.compile( "BEGIN .*? END", Pattern.CASE_INSENSITIVE | Pattern.DOTALL ); 

Ruby: Modificatorul (?m) și indicatorul m
În Ruby, puteți utiliza modificatorul inline (?m), de exemplu în (?m)BEGIN .*? END. Aceasta este o ciudățenie ciudată a lui Ruby, deoarece alte motoare folosesc (?m) pentru modul „^ și $ se potrivesc pe fiecare linie”.
Vezi secțiunea despre modificatorii inline pentru detalii suculente despre trei caracteristici suplimentare: activarea acestuia în mijlocul șirului, dezactivarea lui cu (?-m) sau aplicarea lui doar la conținutul unui grup care nu este capturat cu (?m:foo)
Ruby vă permite, de asemenea, să adăugați steagul m la sfârșitul șirului regex. De exemplu, puteți folosi:
block_regex = /BEGIN .*? END/m
(legătură directă)
Origini ale DOTALL
Modul cu o singură linie este, de asemenea, adesea numit DOTALL (care înseamnă „dot matches all”) din cauza opțiunii PCRE_DOTALL din PCRE, a opțiunii re.DOTALL din Python și a opțiunii Pattern.DOTALL din Java.
Am auzit de mai multe ori afirmându-se că „DOTALL este o chestie Python”, dar acest lucru părea să vină de la persoane care nu auziseră despre opțiunile echivalente din PCRE și Java. Totuși, acest lucru m-a făcut să mă întreb: unde a apărut prima dată DOTALL? Dacă ne uităm în jurnalul de modificări PCRE și în vechea documentație Python, se pare că a apărut în PCRE cu versiunea 0.96 (octombrie 1997), în Python cu versiunea 1.5 (februarie 1998), apoi în Java 1.4 (februarie 2002). Decalajul dintre introducerile PCRE și Python nu a fost concludent – cuvântul ar fi putut fi în circulație în versiuni beta anterioare sau chiar în alte instrumente – așa că l-am întrebat pe Philip Hazel (părintele PCRE) despre acest lucru. El a răspuns:

Cred că eu l-am inventat – cu siguranță nu îl văzusem în altă parte când încercam să mă gândesc la un nume pentru opțiunea PCRE care să corespundă opțiunii /s din Perl. („S” acolo vine de la „single-line” (…), așa că am vrut un nume mai bun.)

Așa că există. Cei cărora le place un pic de istorie s-ar putea să se bucure de această pepită savuroasă.
(link direct)

Multiline (^ și $ se potrivesc pe fiecare linie): m (cu excepția Ruby)

În mod implicit, în toate motoarele majore, cu excepția Ruby, ancorele ^ și $ se potrivesc (respectiv) doar la începutul și la sfârșitul șirului de caractere.
În Ruby, ele se potrivesc la începutul și la sfârșitul fiecărei linii, și nu există nicio modalitate de a dezactiva această caracteristică. Acesta este de fapt un mod rezonabil de a face lucrurile, cu care Ruby se răscumpără parțial pentru că folosește m pentru modul DOTALL când alte motoare folosesc s.

În alte motoare, dacă doriți ca modele precum ^Define și >>>$ să se potrivească (respectiv) la începutul și la sfârșitul fiecărui rând, trebuie să activăm această caracteristică.
Această caracteristică se numește de obicei multi-linie (de unde și m) deoarece ancorele ^ și $ operează pe mai multe linii.
Pentru mai multe motoare, rețineți că există două moduri de a o activa: ca modificator inline (?m) sau ca opțiune în metoda sau funcția regex.
Ruby
În Ruby, ancorele ^ și $ se potrivesc întotdeauna pe toate liniile. Nu există nicio modalitate de a dezactiva această opțiune. Acesta este de fapt un mod destul de frumos de a face lucrurile, deoarece, ca în majoritatea aromelor, există ancore separate pentru începutul și sfârșitul șirurilor de caractere: \A, \Z și \z.
Pe de altă parte, se poate regreta alegerea lui Ruby de a folosi steagul m și modificatorul într-un mod nestandardizat (vezi DOTALL).
Modificator inline (?m)
În .NET, PCRE (C, PHP, R…), Perl, Python, Java și Ruby (dar nu și JavaScript), puteți folosi modificatorul inline (?m), de exemplu în (?m)^cat. Consultați secțiunea privind modificatorii inline pentru detalii suculente despre trei caracteristici suplimentare (indisponibile în Python): activarea acestuia în mijlocul șirului de caractere, dezactivarea lui cu (?-m) sau aplicarea lui numai la conținutul unui grup care nu este capturat cu (?m:foo)
.NET
Pe lângă modificatorul inline (?m), limbajele .NET dispun de opțiunea Multiline. De exemplu, în C# puteți folosi:

var catRegex = new Regex("^cat", RegexOptions.IgnoreCase | RegexOptions.Multiline); 

Perl
În afară de modificatorul inline (?m), Perl vă permite să adăugați stegulețul m după delimitatorul de închidere al modelului dumneavoastră. De exemplu, puteți folosi:
if ($the_subject =~ m/^cat/m) { … }
PCRE (C, PHP, R…)
Pe lângă modificatorul inline (?m), PCRE vă permite să setați modul PCRE_MULTILINE atunci când apelați funcția pcre_compile() (sau o funcție similară):

cat_regex = pcre_compile( "^cat", PCRE_CASELESS | PCRE_MULTILINE, &error, &erroroffset, NULL ); 

În PHP, opțiunea PCRE_MULTILINE este transmisă prin intermediul stegulețului m, pe care îl puteți adăuga în șirul dumneavoastră regex după delimitatorul de închidere. De exemplu, puteți folosi:
$cat_regex = '~^cat~m';
Python
În afară de modificatorul inline (?m), Python are opțiunea MULTILINE. De exemplu, puteți utiliza:
cat_regex = re.compile("^cat", re.IGNORECASE | re.MULTILINE)
Java
Pe lângă modificatorul inline (?m), Java are opțiunea MULTILINE. De exemplu, puteți utiliza:

Pattern catRegex = Pattern.compile( "^cat", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE ); 

JavaScript
În JavaScript, singura dvs. opțiune este să adăugați steagul m după delimitatorul de închidere al modelului. De exemplu, puteți utiliza:
var catRegex = /^cat/m;
(legătură directă)

Spațiere liberă: x (cu excepția JavaScript)

În mod implicit, orice spațiu dintr-un șir regex specifică un caracter care trebuie să fie potrivit. În limbajele în care puteți scrie șiruri regex pe mai multe linii, întreruperile de linie specifică, de asemenea, caracterele literale care urmează să fie potrivite. Deoarece nu puteți insera spații pentru a separa grupuri care au înțelesuri diferite (așa cum faceți între fraze și pragrafe atunci când scrieți în limba engleză), un regex poate deveni greu de citit, ca de exemplu regexul Meaning of Life de pe pagina de umor regex:
^(?=(?!(.))()(?-1)(?<!\d(?<=(?!)\d))).$
Din fericire, multe motoare acceptă un mod de spațiere liberă care vă permite să aerisiți regexul. De exemplu, puteți adăuga spații între token-uri. În PHP, ați putea scrie așa – observați steagul x după delimitatorul final ~:
$word_with_digit_and_cap_regex = '~ ^ (?=\D*\d) \w*\w* $ ~x';
Dar de ce să rămâneți pe o singură linie? Puteți să vă răspândiți regex-ul pe cât de multe linii doriți-indentând și adăugând comentarii- care sunt introduse de un #. De exemplu, în C# puteți face ceva de genul acesta:

var wordWithDigitAndCapRegex = new Regex(@"(?x) # Free-spacing mode ^ # Assert that position = beginning of string ######### Lookahead ########## (?= # Start lookahead \D* # Match any non-digits \d # Match one digit ) # End lookahead ######## Matching Section ######## \w* # Match any word chars # Match one upper-case letter \w* # Match any word chars $ # Assert that position = end of string");

Acest mod se numește mod de spațiere liberă. Îl mai puteți vedea numit și modul spațiu alb, modul comentariu sau modul verbose.
Este posibil să fie exagerat într-un regex simplu ca cel de mai sus (deși oricine trebuie să vă întrețină codul vă va mulțumi pentru asta). Dar dacă construiți un model regex serios, cum ar fi cel din truc, pentru a potrivi numere în engleză simplă… Dacă nu sunteți masochist, nu aveți de ales.
Rețineți că în interiorul unei clase de caractere, caracterul spațiu și # (care altfel introduce comentarii) sunt încă onorate – cu excepția Java, unde ambele trebuie să fie scăpate dacă vreți să potriviți aceste caractere.
Pentru mai multe motoare, există două moduri de activare a modului de spațiere liberă: ca modificator inline sau ca opțiune în metoda sau funcția regex.

Modul de spațiere liberă este minunat, dar există câteva pericole minore de care ar trebui să fiți conștienți, deoarece vă pot face să vă zgâriați pe cap întrebându-vă de ce un model nu funcționează așa cum vă așteptați.
Pericolul de călătorie #1: Semnificația spațiului
În primul rând, nu mai puteți folosi Number: \d+ pentru a potrivi un șir de caractere cum ar fi Număr: 24. Motivul este că spațiul din : \d nu se mai potrivește cu un spațiu. Suntem în modul de spațiere liberă, vă amintiți? Acesta este scopul.
Pentru a potrivi un caracter spațiu, trebuie să îl specificați. Cele două modalități principale de a face acest lucru sunt să îl plasați în interiorul unei clase de caractere sau să îl scăpați cu o backslash. Oricare dintre acestea ar funcționa: Number:\d+ sau Number:\ \d+
Desigur Number:\s\d+ s-ar potrivi, de asemenea, cu Number:\s\d+, dar nu uitați că \s se potrivește cu mult mai mult decât un caracter de spațiu. De exemplu, se poate potrivi cu o tabulație sau o pauză de linie. S-ar putea să nu fie ceea ce doriți.
Trip Hazard #2: Late Start
În al doilea rând, s-ar putea să deveniți prea încrezători în puterea spațierii libere și să încercați ceva de genul acesta pentru a lăsa regex-ul să stea de unul singur:

var wordWithDigitAndCapRegex = new Regex(@" (?x) # Free-spacing mode ^ # Beginning of string etc # Match the literal chars e,t,c");

Problema cu acest lucru este că, deși poate părea că modificatorul de spațiere liberă (?x) este primul lucru din regex-ul dumneavoastră, nu este așa.
După ghilimelele duble de deschidere „, avem o pauză de linie și un număr de spații. Motorul încearcă să se potrivească cu acestea, deoarece în acel stadiu nu suntem încă în modul de spațiere liberă. Acest mod este activat numai atunci când întâlnim (?x). Acest regex nu se va potrivi niciodată cu șirul etc. și mai mult, pentru că în momentul în care întâlnim începutul șirului ancoră ^, se presupune că am potrivit deja o întrerupere de linie și caracterele de spațiere!
De aceea, dacă vă uitați la primul exemplu, veți vedea că modificatorul de spațiere liberă (?x) este primul lucru după caracterul de deschidere a ghilimelelor.
Spațiul alb nu este pur și simplu tăiat din tipar
Chiar dacă spațiul alb este ignorat, poziția unui spațiu alb încă separă simbolul anterior de următorul. De exemplu,
✽ (A)\1 2 nu este același lucru cu (A)\12. Primul se potrivește cu AA2, al doilea se potrivește cu A\n în .NET, PCRE, Perl și Ruby (12 este codul octal pentru caracterul linefeed)
✽ \p{Nd} este valid, dar \p{N d} nu este – cu excepția Perl și Ruby

JavaScript
JavaScript nu suportă modul de spațiere liberă. În JavaScript, pentru a potrivi orice caracter, inclusiv pauzele de linie, utilizați o construcție precum . Această clasă de caractere se potrivește cu un caracter care este fie o cifră care nu este o cifră \D, fie o cifră \d. Prin urmare, se potrivește cu orice caracter.
O altă soluție JavaScript este de a utiliza biblioteca regex XRegExp. Dacă aveți timp infinit la dispoziție, puteți încerca, de asemenea, să portați PCRE în JavaScript folosind Emscripten, așa cum se pare că a făcut Firas pe regex 101.
Modificator inline (?s)
În .NET, PCRE (C, PHP, R…), Perl, Python, Java și Ruby (dar nu și în JavaScript), puteți folosi modificatorul inline (?x), de exemplu, acesta este un regex aerisit pentru a potrivi cuvinte repetate:
(?x) (\w+) + \bVezi, de asemenea, secțiunea privind modificatorii inline.
.NET
Pe lângă modificatorul inline (?x), limbajele .NET au opțiunea IgnorePatternWhitespace. De exemplu, în C# puteți folosi:

var repeatedWordRegex = new Regex(@" (\w+) + \b", RegexOptions.IgnorePatternWhitespace );

Perl
În afară de modificatorul inline (?x), Perl vă permite să adăugați stegulețul x după delimitatorul de închidere al modelului. De exemplu, puteți folosi:
if ($the_subject =~ m/(\w+) + \b/x) { … }
PCRE (C, PHP, R…)
Pe lângă modificatorul (?x) inline, PCRE vă permite să setați modul PCRE_EXTENDED atunci când apelați funcția pcre_compile() (sau o funcție similară):

repeated_word_regex = pcre_compile( "(\w+) + \b", PCRE_EXTENDED, &error, &erroroffset, NULL ); 

În PHP, opțiunea PCRE_EXTENDED este transmisă prin intermediul indicatorului x, pe care îl puteți adăuga în șirul regex după delimitatorul de închidere. De exemplu, puteți folosi:
$repeated_word_regex = '~(\w+) + \b~x';
Python
În afară de modificatorul inline (?x), Python are opțiunea VERBOSE. De exemplu, puteți utiliza:
repeated_word_regex = re.compile(r"(\w+) + \b", re.VERBOSE)
Java
În comparație cu alte motoare, în interiorul unei clase de caractere Java, hașurile introduc comentarii și spațiile sunt ignorate, deci trebuie să le scăpați dacă doriți să utilizați aceste caractere într-o clasă, de exemplu +
În afară de modificatorul (?x) inline, Java are opțiunea COMMENTS. De exemplu, puteți utiliza:

Pattern repeatedWordRegex = Pattern.compile( "(\w+) + \1\b", Pattern.COMMENTS );

Ruby
În afară de modificatorul (?x) inline, Ruby vă permite să adăugați steagul x la sfârșitul șirului regex. De exemplu, puteți folosi:
repeated_word_regex = /(\w+) + \b/x
(link direct)

Alți modificatori

Câteva motoare acceptă modificatori și stegulețe în plus față de i, s, m și x. Intenționez să le abordez în paginile dedicate acelor variante.
De exemplu,
✽ .NET are modificatorul (?n) (accesibil și prin opțiunea ExplicitCapture). Acesta transformă toate (parantezele) în grupuri de non-captură. Pentru a captura, trebuie să folosiți grupuri cu nume.
✽ Java are modificatorul (?d) (accesibil și prin opțiunea UNIX_LINES). Când acesta este activat, caracterul de avans de linie \n este singurul care afectează punctul . (care nu se potrivește cu întreruperile de linie, cu excepția cazului în care DOTALL este activat) și cu ancorele ^ și $ (care se potrivesc cu începuturile și sfârșiturile de linie în modul multiliniă.)
✽ Perl are mai mulți alți indicatori. Consultați secțiunea modificatori din documentație.
✽ PCRE are modificatorul (?J) (disponibil și în cod prin opțiunea PCRE_DUPNAMES). Atunci când este setat, se permite ca diferite grupuri de captură să folosească același nume – deși li se vor atribui numere diferite.
(legătură directă)
✽ PCRE are modificatorul (?U) (de asemenea, disponibil în cod prin intermediul opțiunii PCRE_UNGREEDY). Atunci când este setat, cuantificatorii sunt în mod implicit ungreedy. Adăugarea unui ? îi face lacomi.
(legătură directă)
✽ PCRE are modificatorul (?X) (disponibil, de asemenea, în cod prin intermediul opțiunii PCRE_EXTRA). Din punct de vedere istoric, acest mod a fost utilizat pentru a activa noi caracteristici în dezvoltare. În momentul de față, acesta declanșează erori în cazul în care simboluri precum \B sunt utilizate într-o clasă de caractere (unde, în mod normal, se potrivește cu litera majusculă B, spre deosebire de exteriorul unei clase de caractere, unde este o afirmație de tip „not-a-word-boundary-boundary”).
✽ PCRE are un număr de modificatori speciali care pot fi setați la începutul modelului (aceștia sunt prezentați mai jos). În plus, multe opțiuni pot fi trimise la familia de funcții pcre_compile(), dacă aveți acces la acestea. Pentru detalii despre acestea, obțineți pcre_compile.html din dosarul doc descărcând PCRE.
(legătură directă)

Modificatori speciali de început de model ai PCRE

PCRE are un număr de „modificatori speciali” pe care îi puteți seta la începutul unui model. În loc de sintaxa standard (?z) pentru modificatorii în linie, sintaxa modificatorilor speciali arată ca (*MYMODIFIER). Acești modificatori sunt deosebit de utili în contextele în care PCRE este integrat într-un instrument sau într-un limbaj, deoarece înlocuiesc o serie de opțiuni pe care le-ați trimite la pcre_compile().

Șiruri UTF
Să presupunem că PCRE este compilat cu opțiunile relevante, puteți instrui motorul să trateze șirul subiectului ca pe diverse tipuri de șiruri UTF.
✽ (*UTF) este o modalitate generică de a trata subiectul ca pe un șir UTF-detectarea dacă acesta trebuie tratat ca UTF-8, UTF-16 sau UTF-32.
✽ (*UTF8), (*UTF16) și (*UTF32) tratează șirul ca fiind una dintre cele trei codificări UTF specifice.
Proprietăți Unicode pentru \d și \w
În mod implicit, \d se potrivește numai cu cifrele ASCII, în timp ce \w se potrivește numai cu cifrele, literele și sublinierile ASCII.
Modificatorul (*UCP) (care semnifică Unicode Character Properties) permite acestor simboluri să se potrivească cu cifrele Unicode și cu caracterele cuvintelor.
De exemplu, (*UCP)\d+ :: \w+ se potrivește cu 1۳۲١८৮੪ :: Aれま래도ᚠᚱᚩ
(A se vedea demonstrația).
În combinație cu (*UCP), este posibil să fie necesar să utilizați și unul dintre modificatorii (*UTF). Pentru a vedea cum funcționează acest lucru, luați în considerare ieșirea acestui program cu un PHP standard Xampp:

$string = '1۳۲١८৮੪ :: Aれま래도ᚠᚱᚩ';$utfregex = "~\d+ :: \w+~";$utfregex = "~(*UCP)\d+ :: \w+~";$utfregex = "~(*UTF)(*UCP)\d+ :: \w+~";$utfregex = "~(*UTF)\d+ :: \w+~";$utfregex = "~\d+ :: \w+~u";foreach (range(0, 4) as $i) { echo "$i: ".preg_match($utfregex,$string)."<br />"; }// Output:// 0: 0// 1: 0// 2: 1 => (*UTF)(*UCP)// 3: 0// 4: 1 => The u flag produces the same result as (*UTF)(*UCP)

Modificatori de întrerupere de linie
În mod implicit, atunci când PCRE este compilat, îi spuneți ce să considere ca fiind o întrerupere de linie atunci când întâlnește un . (deoarece punctul it nu se potrivește cu întreruperile de linie decât în modul dotall), precum și comportamentul ancorelor ^ și $ în modul multiline. Puteți suprascrie această valoare implicită cu următorii modificatori:
✽ (*CR) Numai o întoarcere de cărucior este considerată a fi o întrerupere de linie
✽ (*LF) Numai o alimentare de linie este considerată a fi o întrerupere de linie (ca în Unix)
✽ (*CRLF) Numai o întoarcere de cărucior urmată de o alimentare de linie este considerată a fi o întrerupere de linie (ca în Windows)
✽ (*ANYCRLF) Oricare dintre cele trei de mai sus este considerată a fi o întrerupere de linie
✽ (*ANY) Orice secvență de newline Unicode este considerată a fi o întrerupere de linie
De exemplu, (*CR)\w+.\w+ se potrivește cu Line1\nLine2, deoarece punctul este capabil să se potrivească cu \n, care nu este considerat a fi o întrerupere de linie. A se vedea demo.
Controlul \R
În mod implicit, metacaracterul \R se potrivește cu orice secvență de newline Unicode. Atunci când modul UTF-8 este dezactivat, aceste secvențe newline sunt perechea \r\n, precum și caracterele de revenire la cărucior, avans de linie, tabulare verticală, avans de formă sau linia următoare. În modul UTF-8, simbolul se potrivește, de asemenea, cu caracterul separator de linie și cu caracterul separator de paragraf.
Doi modificatori de început de model vă permit să schimbați comportamentul lui \R:
✽ Cu (*BSR_ANYCRLF), \R se potrivește numai cu secvența \r\n, \r sau \n. Acest lucru poate fi, de asemenea, setat atunci când PCRE este compilat sau solicitat prin intermediul opțiunii PCRE_BSR_ANYCRLF
✽ Cu (*BSR_UNICODE), \R se potrivește cu orice secvență newline Unicode (înlocuind opțiunea PCRE_BSR_ANYCRLF dacă este setată). Aceasta poate fi, de asemenea, setată atunci când PCRE este compilat sau solicitată prin intermediul opțiunii PCRE_BSR_UNICODE
Controlul modelelor de fugă
Pentru a limita numărul de apeluri ale funcției match() de către PCRE, utilizați modificatorul (*LIMIT_MATCH=x), setând x la numărul dorit.
Pentru a limita recursivitatea, utilizați (*LIMIT_RECURSION=d), setând d la cel mai adânc nivel de recursivitate permis.
Dezactivarea optimizărilor
(legătură directă)
În mod implicit, PCRE studiază tiparul și face automat un token cuantificat atomic atunci când următorul token este incompatibil – de exemplu, transformând A+X în A++X. Modificatorul (*NO_AUTO_POSSESS) dezactivează această optimizare. Folosiți acest modificator atunci când doriți să utilizați pcretest pentru a compara două tipare și să vă simțiți bine în legătură cu toate ciclurile pe care le economisește auto-possificarea.
În mod implicit, PCRE efectuează mai multe optimizări pentru a afla mai repede dacă o potrivire va eșua. Modificatorul (*NO_START_OPT) dezactivează aceste optimizări.
Dezactivarea corespondențelor goale
În PCRE2, (*NOTEMPTY) îi spune motorului să nu returneze corespondențe goale. De asemenea, (*NOTEMPTY_ATSTART) îi spune motorului să nu returneze corespondențe goale găsite la începutul subiectului.
Dezactivarea optimizării ancorării automate
În PCRE2, PCRE2_NO_DOTSTAR_ANCHOR îi spune motorului să nu ancoreze automat modelele care încep cu .*
Puteți citi mai multe despre acest indicator pe pagina API PCRE2 (căutați PCRE2_NO_DOTSTAR_ANCHOR).

Nu ratați Ghidul de stil Regex
și Cel mai bun truc Regex din toate timpurile!!!


Cele 1001 de moduri de a folosi Regex
.

Lasă un răspuns

Adresa ta de email nu va fi publicată.