Mønster (Java Platform SE 7) (Norsk)

En samlet representasjon av et regulært uttrykk.

Et vanlig uttrykk, spesifisert som en streng, må først kompileres til en forekomst av denne klassen. Det resulterende mønsteret kan deretter brukes til å lage et Matcher objekt som kan matche vilkårlig tegnsekvenser mot det vanlige uttrykket. Hele staten som er involvert i å utføre en kamp er bosatt i matcheren, så mange matchere kan dele det samme mønsteret.

En typisk anropssekvens er altså

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

En matches -metode er definert av denne klassen som en bekvemmelighet for når et vanlig uttrykk brukes bare en gang. Denne metoden kompilerer et uttrykk og matcher en inngangssekvens mot det i en enkelt påkalling. Uttalelsen

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

tilsvarer de tre utsagnene ovenfor, men for gjentatte kamper er det mindre effektivt siden det ikke tillater at det kompilerte mønsteret gjenbrukes.

Forekomster av denne klassen er uforanderlige og er trygge for bruk av flere samtidige tråder. Forekomster av klassen Matcher er ikke trygge for slik bruk.

Sammendrag av konstruksjoner med regulært uttrykk

Backslash, rømmer og siterer

Backslash-tegnet («\») tjener til å introdusere rømte konstruksjoner, som definert i tabellen over, samt sitere tegn som ellers ville bli tolket som unescaped konstrukter. Dermed samsvarer uttrykket \\ med et enkelt tilbakeslag og \ {samsvarer med et venstre bøyle.

Det er en feil å bruke et tilbakeslag før alle alfabetiske tegn som ikke betegner en rømt konstruksjon; disse er reservert for fremtidige utvidelser av språket med regulært uttrykk. Et tilbakeslag kan brukes før en ikke-alfabetisk karakter, uavhengig av om denne karakteren er en del av en ikke-formet konstruksjon.

Snarstreker innenfor strenglitteratur i Java-kildekode tolkes som påkrevd av The Java ™ Language Specification som enten Unicode-rømning (avsnitt 3.3) eller andre tegnrømmer (seksjon 3.10.6). Det er derfor nødvendig å doble tilbakeslag i strenglitteraler som representerer regulære uttrykk for å beskytte dem mot tolkning av Java bytecode-kompilatoren. Strengen bokstavelig «\ b», for eksempel, samsvarer med et enkelt tilbaketastetegn når det tolkes som et vanlig uttrykk, mens «\\ b» samsvarer med en ordgrense. Strengen bokstavelig «\ (hallo \)» er ulovlig og fører til en kompileringstidsfeil; for å matche strengen (hallo) må strengen bokstavelig «\\ (hallo \\)» brukes.

Tegnklasser

Tegnklasser kan vises innenfor andre tegnklasser, og kan være sammensatt av fagforeningen (implisitt) og kryssoperatøren (& &). Fagforeningsoperatøren betegner en klasse som inneholder hvert tegn som er i minst en av operandklassene. Kryssoperatøren betegner en klasse som inneholder hvert tegn som er i begge operandklassene.

Forrang for karakterklasseoperatører er som følger, fra høyeste til laveste:

1 Literal escape \ x
2 Grouping
3 Range az
4 Union
5 Kryss ]

Vær oppmerksom på at et annet sett med tegn er i kraft i en tegnklasse enn utenfor en karakterklasse. For eksempel det vanlige uttrykket. mister sin spesielle betydning i en karakterklasse, mens uttrykket – blir et område som danner metakarakter.

Linjeterminatorer

En linjeterminator er en sekvens på ett eller to tegn som markerer slutten på en linje i inngangssekvens. Følgende gjenkjennes som linjeterminatorer:

Hvis UNIX_LINES -modus er aktivert, er de eneste linjeterminatorene som er gjenkjent, nye linjetegn.

Det vanlige uttrykket. samsvarer med et hvilket som helst tegn unntatt en linjeterminator, med mindre DOTALL -flagget er spesifisert.

Som standard ignorerer regulære uttrykk ^ og $ linjeterminatorer og samsvarer bare med henholdsvis begynnelsen og slutten av hele inngangssekvensen. Hvis MULTILINE -modus er aktivert, samsvarer ^ med begynnelsen av inngangen og etter en hvilken som helst linjeterminator unntatt på slutten av inngangen. Når i MULTILINE -modus samsvarer $ like før en linjeterminator eller slutten av inngangssekvensen.

Grupper og fangst

Gruppenummer

Fangegrupper nummereres ved å telle de innledende parentesene fra venstre til høyre.I uttrykket ((A) (B (C))) er det for eksempel fire slike grupper:

1

((A) (B (C)))

2

(A)

3

(B (C))

4

(C)

Gruppe null står alltid for hele uttrykket.

Fange grupper er så navngitt fordi hver sekvens av inngangssekvensen som samsvarer med en slik gruppe under en kamp blir lagret. Den fangede undersekvensen kan brukes senere i uttrykket, via en bakreferanse, og kan også hentes fra matcheren når kampoperasjonen er fullført.

Gruppenavn

En fangegruppe kan også tildeles et «navn», en navngitt-fangende gruppe, og blir deretter referert tilbake senere med «navnet». Gruppenavn består av følgende tegn. Det første tegnet må være et brev.

En navngitt gruppe er fremdeles nummerert som beskrevet i gruppenummer.

Den fangede innspillingen som er knyttet til en gruppe, er alltid den følgen som gruppen sist matchet. Hvis en gruppe vurderes en gang til på grunn av kvantifisering, beholdes den tidligere fangede verdien, hvis noen, hvis den andre evalueringen mislykkes. Hvis du for eksempel matcher strengen «aba» mot uttrykket (a (b)?) +, Blir gruppe to satt til «b». Alle innspilte innspill kastes i begynnelsen av hver kamp.

Grupper som begynner med (? er enten rene, ikke-fangende grupper som ikke fanger tekst og ikke teller med i gruppesummen, eller er navngitte grupper.

Unicode-støtte

Denne klassen er i samsvar med nivå 1 i Unicode Technical Standard # 18: Unicode Regular Expression, pluss RL2.1 Canonical Equivalents.

Unicode escape-sekvenser slik som \ u2014 i Java-kildekode behandles som beskrevet i avsnitt 3.3 i Java ™ språkspesifikasjonen. Slike rømningssekvenser implementeres også direkte av reguleringsuttrykk-analysatoren slik at Unicode-rømming kan brukes i uttrykk som leses fra filer eller fra tastaturet. Dermed blir strengene » \ u2014 «og» \\ u2014 «, mens de ikke er like, kompileres til det samme mønsteret, som samsvarer med tegnet med heksadesimalverdien 0x2014.

Et Unicode-tegn kan også vises i et regulært uttrykk ved å bruke dens heksnotasjon (heksadesimal kodeverdi) direkte som beskrevet i konstruksjon \ x {…}, for eksempel kan et tilleggstegn U + 2011F spesifiseres som \ x {2011F}, i stedet for to påfølgende Unicode-rømningssekvenser av surrogatparet \ uD840 \ uDD1F.

Unicode-skript, blokker, kategorier og binære egenskaper skrives med \ p- og \ P-konstruksjonene som i Perl. \ p {prop} stemmer overens hvis inngangen har eiendomsstøtten, mens \ P {prop} ikke stemmer overens hvis inngangen har den egenskapen.

Skript, blokker, kategorier og binære egenskaper kan brukes både innenfor og utenfor en karakterklasse.

Skript angis enten med prefikset Is, som i IsHiragana, eller ved å bruke script nøkkelord (eller dets korte form sc) som i script=Hiragana eller sc=Hiragana.

Skriptnavnene som støttes av Pattern er gyldige skriptnavn som godtas og defineres av UnicodeScript.forName.

Blokker spesifiseres med prefikset In, som i InMongolian, eller ved å bruke nøkkelordet block (eller dens korte form blk) som i block=Mongolian eller blk=Mongolian.

Blokknavnene som støttes av Pattern er de gyldige blokknavnene som godtas og defineres av UnicodeBlock.forName.

Kategorier kan spesifiseres med det valgfrie prefikset Is: Både \p{L} og \p{IsL} betegner kategorien Unicode-bokstaver. Samme som skript og blokker, kategorier kan også spesifiseres ved å bruke nøkkelordet general_category (eller dets korte form gc) som i general_category=Lu eller gc=Lu.

De støttede kategoriene er de av Unicode Standard i versjonen spesifisert av klassen Character. Kategorinavnene er de som er definert i standarden, både normative og informative.

Binære egenskaper er spesifisert med prefikset Is, som i IsAlphabetic.De støttede binære egenskapene av Pattern er

  • Alfabetisk
  • Ideografisk
  • Letter
  • Små bokstaver
  • Store bokstaver
  • Titlecase
  • Tegnsetting
  • Kontroll
  • White_Space
  • Siffer
  • Hex_Digit
  • Noncharacter_Code_Point
  • Tildelt

Forhåndsdefinerte tegnklasser og POSIX tegnklasser er i samsvar med anbefalingen fra Vedlegg C: Kompatibilitetsegenskaper for Unicode Regular Expression når UNICODE_CHARACTER_CLASS flagg er spesifisert.

Kategorier som oppfører seg som java.lang.Character boolean ismethodname metoder (bortsett fra de utdaterte) er tilgjengelige gjennom samme \ p {prop} syntaks der den spesifiserte egenskapen har navnet javamethodname.

Sammenligning med Perl 5

Pattern -motoren utfører tradisjonell NFA-basert samsvar med ordnet veksling som forekommer i Perl 5.

Perl-konstruksjoner støttes ikke av denne klassen:

Konstruksjoner som støttes av denne klassen, men ikke av Perl:

  • Tegnklasseforening og kryss som beskrevet ovenfor.

Merkbare forskjeller fra Perl:

  • I Perl tolkes alltid \ 1 til \ 9 som referanser; et tilbakeslag-rømt tall større enn 9 blir behandlet som en bakreferanse hvis i det minste mange underuttrykk eksisterer, ellers tolkes det, hvis mulig, som en oktal flukt. I denne klassen må oktale rømninger alltid begynne med null. I denne klassen tolkes alltid \ 1 til \ 9 som bakreferanser, og et større tall aksepteres som en bakreferanse hvis i det minste mange underuttrykk eksisterer på det punktet i det regulære uttrykket, ellers vil parseren slippe sifre til tallet er mindre eller lik det eksisterende antallet grupper, eller det er ett siffer.

  • Perl bruker g-flagget til å be om en kamp som gjenopptas der den siste kampen slapp. Denne funksjonaliteten er gitt implisitt av Matcher klassen: Gjentatte påkallelser av find -metoden gjenopptas der den siste kampen slapp, med mindre matcheren tilbakestilles.

  • I Perl påvirker innebygde flagg på øverste nivå av et uttrykk hele uttrykket. I denne klassen trer innebygde flagg alltid i kraft på det tidspunktet de vises, enten de er på toppnivå eller i en gruppe; i sistnevnte tilfelle blir flagg gjenopprettet på slutten av gruppen, akkurat som i Perl.

For en mer presis beskrivelse av oppførselen til konstruksjoner av vanlige uttrykk, se Mastering Regular Expressions, 3. utgave, Jeffrey EF Friedl, O «Reilly and Associates, 2006.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *