Mønster (Java Platform SE 7)

En samlet gengivelse af et regulært udtryk.

Et regulært udtryk, der er angivet som en streng, skal først kompileres til en forekomst af denne klasse. Det resulterende mønster kan derefter bruges til at oprette et Matcher objekt, der kan matche vilkårlige tegnsekvenser mod det regulære udtryk. Alle de stater, der er involveret i at udføre en kamp, er bosiddende i matcheren, så mange matchere kan dele det samme mønster.

En typisk påkaldningssekvens er således

 Pattern p = Pattern.
("a*b"); Matcher m = p.
("aaaaab"); boolean b = m.
();

En matches -metode er defineret af denne klasse som en bekvemmelighed, når et regulært udtryk kun bruges én gang. Denne metode kompilerer et udtryk og matcher en indgangssekvens mod det i en enkelt påkaldelse. Påstanden

 boolean b = Pattern.matches("a*b", "aaaaab");

svarer til de tre udsagn ovenfor, selvom det ved gentagne kampe er mindre effektivt, da det ikke tillader, at det kompilerede mønster genbruges.

Forekomster af denne klasse er uforanderlige og er sikre til brug af flere samtidige tråde. Forekomster af klassen Matcher er ikke sikre til sådan brug.

Oversigt over konstruktioner med regulært udtryk

Backslashes, escapes, and quoting

Backslash-tegnet (“\”) tjener til at introducere undslapte konstruktioner, som defineret i tabellen ovenfor såvel som at citere tegn, der ellers ville blive fortolket som uundgåede konstruktioner. Således matcher udtrykket \\ et enkelt tilbageslag og \ {matcher et venstre bøjle.

Det er en fejl at bruge et tilbageslag før enhver alfabetisk karakter, der ikke angiver en undsluppet konstruktion; disse er forbeholdt fremtidige udvidelser til regulært udtrykssprog. En tilbageslag kan bruges forud for en ikke-alfabetisk karakter, uanset om denne karakter er en del af en ikke-udformet konstruktion.

Backslash inden for strenglitteraler i Java-kildekode fortolkes som krævet af The Java ™ Language Specification som enten Unicode undslipper (afsnit 3.3) eller andre tegn undslipper (afsnit 3.10.6) Det er derfor nødvendigt at fordoble backslides i strenglitteraler, der repræsenterer regulære udtryk for at beskytte dem mod fortolkning af Java bytecode-kompilatoren. Strengens bogstavelige “\ b” matcher for eksempel et enkelt backspace-tegn, når det fortolkes som et regulært udtryk, mens “\\ b” matcher en ordgrænse. Strengens bogstavelige “\ (hej \)” er ulovlig og fører til en kompileringstidsfejl; for at matche strengen (hej) skal strengen bogstaveligt “\\ (hej \\)” bruges.

Tegnklasser

Tegnklasser kan forekomme inden for andre tegnklasser og kan være sammensat af fagforeningen (implicit) og krydsningsoperatoren (& &). Fagforeningsoperatøren angiver en klasse, der indeholder hvert tegn, der er i mindst en af dets operandklasser. Krydsoperatøren angiver en klasse, der indeholder hvert tegn, der er i begge dets operandklasser.

Forrang for operatorer af karakterklasser er som følger, fra højeste til laveste:

1 Bogstavelig flugt \ x
2 Gruppering
3 Range az
4 Union
5 Skæringspunkt ]

Bemærk, at et andet sæt metategn er i kraft inden for en tegnklasse end uden for en karakter klasse. For eksempel det regulære udtryk. mister sin specielle betydning inde i en karakterklasse, mens udtrykket – bliver et område, der danner metakarakter.

Linjeterminatorer

En linjeterminator er en sekvens på én eller to tegn, der markerer slutningen af en linje i inputkarakteresekvensen. Følgende genkendes som linjeterminatorer:

Hvis UNIX_LINES -tilstand er aktiveret, er de eneste linjeterminatorer, der genkendes, nye linjetegn.

Det regulære udtryk. matcher ethvert tegn undtagen en linjeterminator, medmindre DOTALL flag er angivet.

Som standard ignorerer regulære udtryk ^ og $ linjeterminatorer og matcher kun i henholdsvis begyndelsen og slutningen af hele indgangssekvensen. Hvis MULTILINE -tilstand er aktiveret, svarer ^ til i begyndelsen af input og efter en hvilken som helst linjeterminator undtagen ved slutningen af input. Når i MULTILINE mode $ matcher lige før en linjeterminator eller slutningen af indgangssekvensen.

Grupper og opsamling

Gruppenummer

Optagelsesgrupper nummereres ved at tælle deres indledende parenteser fra venstre mod højre.I udtrykket ((A) (B (C))) er der for eksempel fire sådanne grupper:

1

((A) (B (C)))

2

(A)

3

(B (C))

4

(C)

Gruppe nul står altid for hele udtrykket.

Optagelsesgrupper navngives således, fordi hver sekvens af den indgangssekvens, der matcher en sådan gruppe, under en kamp gemmes. Den fangede sekvens kan bruges senere i udtrykket via en tilbagehenvisning og kan også hentes fra matcheren, når matchoperationen er afsluttet.

Gruppenavn

En fangergruppe kan også tildeles et “navn”, en navngivet gruppe, og derefter henvises der tilbage til det med “navnet”. Gruppens navne består af følgende tegn. Det første tegn skal være et bogstav.

En navngivet gruppe er stadig nummereret som beskrevet i gruppe nummer.

Det indfangne input, der er knyttet til en gruppe, er altid den efterfølgende, som gruppen sidst matchede. Hvis en gruppe evalueres en anden gang på grund af kvantificering, bevares den tidligere fangede værdi, hvis nogen, hvis den anden evaluering mislykkes. Hvis man f.eks. Matcher strengen “aba” med udtrykket (a (b)?) +, Er gruppe to sat til “b”. Alt optaget input kasseres i begyndelsen af hver kamp.

Grupper der begynder med (? er enten rene, ikke-fangende grupper, der ikke fanger tekst og tæller ikke med i gruppens samlede eller navngivne gruppe, der fanger.

Unicode-understøttelse

Denne klasse er i overensstemmelse med niveau 1 i Unicode Technical Standard # 18: Unicode Regular Expression plus RL2.1 Canonical Equivalents.

Unicode escape-sekvenser såsom \ u2014 i Java-kildekode behandles som beskrevet i afsnit 3.3 i Java ™ sprogspecifikationen. Sådanne flugtsekvenser implementeres også direkte af parseren med regulært udtryk, så Unicode-undslip kan bruges i udtryk, der læses fra filer eller fra tastaturet. Dermed er strengene ” \ u2014 “og” \\ u2014 “, mens de ikke er ens, kompileres i det samme mønster, der matcher tegnet med den hexadecimale værdi 0x2014.

Et Unicode-tegn kan også repræsenteres i et regulært udtryk ved dens Hex-notation (hexadecimal kode punktværdi) direkte som beskrevet i konstruktion \ x {…} til eksempel kan et supplerende tegn U + 2011F angives som \ x {2011F} i stedet for to på hinanden følgende Unicode-escape-sekvenser af surrogatparret \ uD840 \ uDD1F.

Unicode-scripts, blokke, kategorier og binære egenskaber skrives med \ p- og \ P-konstruktionerne som i Perl. \ p {prop} matcher, hvis input har ejendomsstøtten, mens \ P {prop} ikke matcher, hvis input har den egenskab.

Scripts, blokke, kategorier og binære egenskaber kan bruges både inden for og uden for en karakterklasse.

Scripts specificeres enten med præfikset Is som i IsHiragana eller ved hjælp af script nøgleord (eller dets korte form sc) som i script=Hiragana eller sc=Hiragana.

Scriptnavne understøttet af Pattern er de gyldige scriptnavne, der accepteres og defineres af UnicodeScript.forName.

Blokke angives med præfikset In, som i InMongolian, eller ved hjælp af nøgleordet block (eller dens korte form blk) som i block=Mongolian eller blk=Mongolian.

De bloknavne, der understøttes af Pattern, er de gyldige bloknavne, der accepteres og defineres af UnicodeBlock.forName.

Kategorier kan specificeres med det valgfri præfiks Is: Både \p{L} og \p{IsL} angiver kategorien af Unicode-bogstaver. Samme som scripts og blokke, kategorier kan også specificeres ved hjælp af nøgleordet general_category (eller dets korte form gc) som i general_category=Lu eller gc=Lu.

De understøttede kategorier er de af Unicode Standard i den version, der er angivet af klassen Character. Kategorinavnene er defineret i standarden, både normative og informative.

Binære egenskaber angives med præfikset Is, som i IsAlphabetic.De understøttede binære egenskaber af Pattern er

  • Alfabetisk
  • Ideografisk
  • Bogstav
  • Små bogstaver
  • Store bogstaver
  • Titlecase
  • Punktuering
  • Kontrol
  • White_Space
  • Ciffer
  • Hex_Digit
  • Noncharacter_Code_Point
  • Tildelt

Foruddefinerede tegnklasser og POSIX tegnklasser er i overensstemmelse med anbefalingen fra Bilag C: Kompatibilitetsegenskaber for Unicode Regular Expression, når UNICODE_CHARACTER_CLASS flag er angivet.

Kategorier, der opfører sig som java.lang.Character boolean ismethodname-metoder (undtagen for de forældede) er tilgængelige via den samme \ p {prop} syntaks, hvor den angivne egenskab har navnet javamethodname.

Sammenligning med Perl 5

Pattern -motoren udfører traditionel NFA-baseret matchning med ordnet alternering som forekommer i Perl 5.

Perl-konstruktioner understøttes ikke af denne klasse:

Konstruktioner understøttet af denne klasse, men ikke af Perl:

  • Tegnklasseforbindelse og skæringspunkt som beskrevet ovenfor.

Bemærkelsesværdige forskelle fra Perl:

  • I Perl fortolkes \ 1 til \ 9 altid som baghenvisninger; et backslash-undsluppet tal større end 9 behandles som en backhenvisning, hvis i det mindste der findes mange underudtryk, ellers fortolkes det, hvis det er muligt, som en oktal flugt. I denne klasse skal oktale undslip altid begynde med et nul. I denne klasse fortolkes \ 1 til \ 9 altid som backhenvisninger, og et større tal accepteres som en backhenvisning, hvis i det mindste der findes mange underudtryk på det tidspunkt i det regulære udtryk, ellers vil parseren slippe cifre indtil tallet er mindre eller lig med det eksisterende antal grupper, eller det er et ciffer.

  • Perl bruger g-flag til at anmode om en kamp, der genoptages, hvor den sidste kamp slap. Denne funktionalitet leveres implicit af Matcher klassen: Gentagne påkald af find metoden genoptages, hvor den sidste kamp slap, medmindre matcheren nulstilles.

  • I Perl påvirker indlejrede flag på det øverste niveau af et udtryk hele udtrykket. I denne klasse træder indlejrede flag altid i kraft på det tidspunkt, hvor de vises, uanset om de er på det øverste niveau eller inden for en gruppe; i sidstnævnte tilfælde gendannes flag ved slutningen af gruppen ligesom i Perl.

For en mere præcis beskrivelse af opførelsen af regulære ekspressionskonstruktioner, se Mastering Regular Expressions, 3. udgave, Jeffrey EF Friedl, O “Reilly and Associates, 2006.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *