Model (Java Platform SE 7)
O reprezentare compilată a unei expresii regulate.
O expresie regulată, specificată ca șir, trebuie mai întâi compilată într-o instanță a acestei clase. Șablonul rezultat poate fi apoi utilizat pentru a crea un obiect Matcher
care poate corespunde secvențelor de caractere arbitrare
împotriva expresiei regulate. Toată statul implicat în efectuarea unui meci se află în meci, astfel încât mulți meci pot împărtăși același tipar.
O secvență de invocare tipică este astfel
Pattern p = Pattern.("a*b"); Matcher m = p.("aaaaab"); boolean b = m.();
O metodă matches
este definită de această clasă ca o comoditate atunci când o expresie regulată este utilizată o singură dată. Această metodă compilează o expresie și se potrivește cu o secvență de intrare într-o singură invocație. Afirmația
boolean b = Pattern.matches("a*b", "aaaaab");
este echivalentă cu cele trei afirmații de mai sus, deși pentru potrivirile repetate este mai puțin eficient, deoarece nu permite reutilizarea modelului compilat.
Instanțele din această clasă sunt imuabile și sunt sigure pentru a fi utilizate de mai multe fire simultane. Instanțele din clasa Matcher
nu sunt sigure pentru o astfel de utilizare.
Rezumatul constructelor de expresie regulată
Barele oblice inverse, scăpările și citarea
Caracterul de bară inversă („\”) servește la introducerea constructelor evadate, așa cum este definit în tabelul de mai sus, precum și pentru a cita caractere care altfel ar fi interpretate ca construcții neevacuate. Astfel, expresia \\ se potrivește cu o singură bară inversă și \ {se potrivește cu o acoladă stângă.
Este o eroare să folosiți o bară inversă înainte de orice caracter alfabetic care nu denotă o construcție scăpată; acestea sunt rezervate extensiilor viitoare ale limbajului de expresie regulată. O bară inversă poate fi utilizată înainte de un caracter non-alfabetic, indiferent dacă acel caracter face parte dintr-o construcție neevacuată.
Backslash-urile din literele șirului din codul sursă Java sunt interpretate conform cerințelor din Java ™ Language Specification, fie că Unicode scapă (secțiunea 3.3), fie scapă alte caractere (secțiunea 3.10.6). în litere șir care reprezintă expresii regulate pentru a le proteja de interpretarea de către compilatorul Java bytecode. Șirul literal „\ b”, de exemplu, se potrivește cu un singur caracter backspace atunci când este interpretat ca o expresie regulată, în timp ce „\\ b” se potrivește cu o limită de cuvânt. Șirul literal „\ (hello \)” este ilegal și duce la o eroare în timpul compilării; pentru a se potrivi șirului (hello) trebuie folosit literalul șir „\\ (hello \\)”.
Clasele de caractere
Clasele de caractere pot apărea în alte clase de caractere și pot fi compuse de operatorul de unire (implicit) și operatorul de intersecție (& &). Operatorul sindical denotă o clasă care conține fiecare caracter care se află în cel puțin una dintre clasele sale de operand. Operatorul de intersecție denotă o clasă care conține fiecare caracter care se află în ambele clase de operand.
Prioritatea operatorilor de clase de caractere este următoarea, de la cel mai mare la cel mai mic:
1 Evadare literală \ x 2 Grupare 3 Range az 4 Union 5 Intersecție ]
Rețineți că un set diferit de metacaractere este în vigoare în interiorul unei clase de caractere decât în afara unei clasa de personaje. De exemplu, expresia regulată. își pierde semnificația specială în interiorul unei clase de caractere, în timp ce expresia – devine o gamă formând metacaracter.
Terminatori de linie
Un terminator de linie este o secvență de unul sau două caractere care marchează sfârșitul unei linii a secvenței de caractere de intrare. Următorii sunt recunoscuți ca terminatori de linie:
Dacă modul UNIX_LINES
este activat, atunci singurii terminatori de linie recunoscuți sunt caractere de linie nouă.
Expresia regulată. se potrivește cu orice caracter, cu excepția unui terminator de linie, cu excepția cazului în care este specificat semnalizatorul DOTALL
.
În mod implicit, expresiile regulate ^ și $ ignoră terminatorii de linie și se potrivesc doar la începutul și, respectiv, la sfârșitul întregii secvențe de intrare. Dacă modul MULTILINE
este activat, atunci ^ se potrivește la începutul intrării și după orice terminator de linie, cu excepția sfârșitului intrării. Când în modul MULTILINE
$ se potrivește chiar înainte de un terminator de linie sau de sfârșitul secvenței de intrare.
Grupurile și capturarea
Numărul grupului
Grupurile de captare sunt numerotate numărând parantezele de deschidere de la stânga la dreapta.În expresia ((A) (B (C))), de exemplu, există patru astfel de grupuri:
1 ((A) (B (C)))
2 (A)
3 (B (C))
4 (C)
Grupul zero reprezintă întotdeauna întreaga expresie.
Grupurile de captare sunt denumite astfel deoarece, în timpul unui meci, fiecare subsecvență a secvenței de intrare care se potrivește cu un astfel de grup este salvată. Subsecvența capturată poate fi utilizată mai târziu în expresie, printr-o referință din spate și poate fi, de asemenea, preluată de la meci odată ce operațiunea de potrivire este finalizată.
Numele grupului
Unui grup de capturare i se poate atribui și un „nume”, un grup de capturare cu nume și apoi poate fi referit înapoi ulterior cu „nume”. Numele grupurilor sunt compuse din următoarele caractere. Primul caracter trebuie să fie o literă.
Un grup de capturare numită este încă numerotat așa cum este descris în numărul grupului.
Intrarea capturată asociată unui grup este întotdeauna subsecvența pe care grupul a potrivit-o cel mai recent. Dacă un grup este evaluat a doua oară din cauza cuantificării, atunci valoarea sa capturată anterior, dacă există, va fi păstrată dacă a doua evaluare eșuează. Potrivirea șirului „aba” cu expresia (a (b)?) +, De exemplu, lasă grupul doi setat la „b”. Toate intrările capturate sunt aruncate la începutul fiecărui meci.
Grupurile care încep cu (? sunt fie grupuri pure, care nu captează, care nu captează text și nu se iau în considerare pentru totalul grupului, fie grupul cu captură numită.
Suport Unicode
Această clasă este în conformitate cu nivelul 1 al standardului tehnic Unicode # 18: Unicode Regular Expression, plus RL2.1 Canonical Equivalents.
Secvențe de evadare Unicode, cum ar fi \ u2014 în codul sursă Java sunt procesate așa cum este descris în secțiunea 3.3 din specificația limbajului Java ™. Astfel de secvențe de evacuare sunt de asemenea implementate direct de parserul de expresii regulate, astfel încât scăpările Unicode să poată fi utilizate în expresiile citite din fișiere sau de la tastatură. Astfel șirurile ” \ u2014 „și” \\ u2014 „, deși nu sunt egale, se compilează în același model, care se potrivește caracterului cu valoarea hexazecimală 0x2014.
Un caracter Unicode poate fi reprezentat și într-o expresie regulată folosind notația Hex (valoarea punctului de cod hexazecimal) direct așa cum este descris în construct \ x {…}, pentru de exemplu, un caracter suplimentar U + 2011F poate fi specificat ca \ x {2011F}, în loc de două secvențe consecutive de evadare Unicode ale perechii surogate \ uD840 \ uDD1F.
Scripturile, blocurile, categoriile și proprietățile binare Unicode sunt scrise cu constructele \ p și \ P ca în Perl. \ p {prop} se potrivește dacă intrarea are proprietatea prop, în timp ce \ P {prop} nu se potrivește dacă intrarea are acea proprietate.
Scripturile, blocurile, categoriile și proprietățile binare pot fi utilizate atât în interiorul, cât și în afara unei clase de caractere.
Scripturile sunt specificate fie cu prefixul Is
, ca în IsHiragana
, fie utilizând script
cuvânt cheie (sau forma sa scurtă sc
) ca în script=Hiragana
sau sc=Hiragana
.
Numele scripturilor acceptate de Pattern
sunt numele scripturilor valide acceptate și definite de UnicodeScript.forName
.
Blocurile sunt specificate cu prefixul In
, ca în InMongolian
, sau utilizând cuvântul cheie block
(sau forma sa scurtă blk
) ca în block=Mongolian
sau blk=Mongolian
.
Numele de blocuri acceptate de Pattern
sunt numele de blocuri valide acceptate și definite de UnicodeBlock.forName
.
Categoriile pot fi specificate cu prefixul opțional Is
: Ambele \p{L}
și \p{IsL}
denotă categoria literelor Unicode. La fel ca scripturile și blocurile, categoriile pot fi, de asemenea, specificate utilizând cuvântul cheie general_category
(sau forma sa scurtă gc
) ca în general_category=Lu
sau gc=Lu
.
Categoriile acceptate sunt cele ale Standardului Unicode în versiunea specificată de clasa Character
. Denumirile categoriilor sunt cele definite în standard, atât normative, cât și informative.
Proprietățile binare sunt specificate cu prefixul Is
, ca în IsAlphabetic
.Proprietățile binare acceptate de Pattern
sunt
- Alfabetic
- Ideografic
- Scrisoare
- Minuscule
- Majuscule
- Titlecase
- Punctuație
- Control
- White_Space
- Cifră
- Hex_Digit
- Noncharacter_Code_Point
- Atribuit
Clasele de caractere predefinite și clasele de caractere POSIX sunt în conformitate cu recomandarea Anexa C: Proprietăți de compatibilitate ale expresiei regulate Unicode, când se specifică semnalizatorul UNICODE_CHARACTER_CLASS
.
Categoriile care se comportă ca metodele jool.lang.Character boolean este un nume de metodă (cu excepția celor depreciate) sunt disponibile prin aceeași sintaxă \ p {prop} în care proprietatea specificată are numele javamethodname.
Comparație cu Perl 5
Motorul Pattern
efectuează potrivire tradițională bazată pe NFA cu alternanță ordonată așa cum se întâmplă în Perl 5.
Construcțiile Perl nu sunt acceptate de această clasă:
Constructele acceptate de această clasă, dar nu de Perl:
-
Uniunea și intersecția clasei de caractere, așa cum este descris mai sus.
Diferențe notabile față de Perl:
-
În Perl, \ 1 până la \ 9 sunt întotdeauna interpretate ca referințe din spate; un număr scăpat de backslash mai mare de 9 este tratat ca o referință inversă dacă există cel puțin atât de multe subexpresii, altfel este interpretat, dacă este posibil, ca o scăpare octală. În această clasă, evadările octale trebuie să înceapă întotdeauna cu un zero. În această clasă, \ 1 până la \ 9 sunt întotdeauna interpretate ca referințe din spate și un număr mai mare este acceptat ca referință din spate dacă există cel puțin atâtea subexpresii în acel moment al expresiei regulate, altfel analizorul va scădea cifre până la numărul este mai mic sau egal cu numărul existent de grupuri sau este de o cifră.
-
Perl folosește steagul g pentru a solicita o potrivire care se reia de unde a rămas ultimul meci. Această funcționalitate este furnizată implicit de clasa
Matcher
: invocațiile repetate ale metodeifind
vor fi reluate acolo unde ultimul meci a rămas, cu excepția cazului în care este resetat. -
În Perl, steagurile încorporate la nivelul superior al unei expresii afectează întreaga expresie. În această clasă, semnalizatoarele încorporate intră întotdeauna în vigoare în punctul în care apar, indiferent dacă sunt la nivelul superior sau în cadrul unui grup; în acest din urmă caz, steagurile sunt restaurate la sfârșitul grupului la fel ca în Perl.
Pentru o descriere mai precisă a comportamentului constructelor de expresii regulate, vă rugăm să consultați Mastering Regular Expressions, ediția a 3-a, Jeffrey EF Friedl, O „Reilly and Associates, 2006.