Mönster (Java Platform SE 7) (Svenska)

En sammanställd representation av ett reguljärt uttryck.

Ett reguljärt uttryck, specificerat som en sträng, måste först kompileras till en instans av denna klass. Det resulterande mönstret kan sedan användas för att skapa ett Matcher -objekt som kan matcha godtyckliga teckensekvenser mot det reguljära uttrycket. Alla stater som är involverade i att utföra en match finns i matcharen, så många matchare kan dela samma mönster.

En typisk anropssekvens är alltså

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

En matches -metod definieras av denna klass som en bekvämlighet för när ett reguljärt uttryck används bara en gång. Den här metoden sammanställer ett uttryck och matchar en ingångssekvens mot det i en enda anrop. Uttalandet

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

motsvarar de tre påståendena ovan, men för upprepade matchningar är det mindre effektivt eftersom det inte tillåter att det kompilerade mönstret återanvänds.

Instanser av denna klass är oföränderliga och är säkra för användning av flera samtidiga trådar. Förekomster av klassen Matcher är inte säkra för sådan användning.

Sammanfattning av konstruktioner med reguljärt uttryck

Backslash, escapes, and quoting

Backslash-tecknet (”\”) tjänar till att introducera escapes-konstruktioner, som definierade i tabellen ovan, samt att citera tecken som annars skulle tolkas som oskyddade konstruktioner. Således matchar uttrycket \\ ett enstaka snedstreck och \ {matchar ett vänster stöd.

Det är ett fel att använda en backslash före något alfabetiskt tecken som inte betecknar en flyktig konstruktion; dessa är reserverade för framtida tillägg till språket med reguljärt uttryck. Ett omvänd snedstreck kan användas före en icke-alfabetisk karaktär oavsett om den karaktären är en del av en konstruktion som inte har form.

Bakåtvända snedstreck inom strängbokstäver i Java-källkod tolkas som krävs av The Java ™ Language Specification som antingen Unicode-släpp (avsnitt 3.3) eller andra teckenfläckar (avsnitt 3.10.6) Det är därför nödvändigt att dubbla snedstreck i stränglitteraler som representerar reguljära uttryck för att skydda dem från tolkning av Java bytecode-kompilatorn. Strängen bokstavligt ”\ b”, till exempel, matchar ett enda bakstegstecken när det tolkas som ett vanligt uttryck, medan ”\\ b” matchar en ordgräns. Strängen bokstavlig ”\ (hej \)” är olaglig och leder till ett kompileringsfel. för att matcha strängen (hej) måste strängen bokstavlig ”\\ (hej \\)” användas.

Teckenklasser

Teckenklasser kan förekomma inom andra teckenklasser och kan bestå av fackföreningen (implicit) och korsningsoperatören (& &). Fackföreningen betecknar en klass som innehåller varje karaktär som finns i minst en av dess operandklasser. Korsningsoperatören betecknar en klass som innehåller varje tecken som finns i båda dess operandklasser.

Teckenklassoperatörernas företräde är som följer, från högsta till lägsta:

1 Bokstavlig flykt \ x
2 Gruppering
3 Range az
4 Union
5 Korsning ]

Observera att en annan uppsättning metatecken är i kraft i en teckenklass än utanför en karaktär klass. Till exempel det reguljära uttrycket. förlorar sin speciella betydelse inuti en karaktärsklass, medan uttrycket – blir ett intervall som bildar metatecken.

Linjeterminatorer

En linjeterminator är en sekvens med en eller två tecken som markerar slutet på en rad i ingångsteckensekvensen. Följande känns igen som linjeterminatorer:

Om UNIX_LINES -läget är aktiverat är de enda linjeavslutarna som är igenkända nya linjetecken.

Regeluttrycket. matchar vilket tecken som helst utom en radterminator såvida inte DOTALL -flaggan anges.

Som standard ignorerar reguljära uttryck ^ och $ radterminatorer och matchar bara i början respektive slutet av hela inmatningssekvensen. Om MULTILINE -läget är aktiverat, matchar ^ i början av ingången och efter en radterminator utom vid slutet av ingången. I MULTILINE -läget matchar $ precis före en linjeterminator eller slutet på ingångssekvensen.

Grupper och fånga

Gruppnummer

Fångningsgrupper numreras genom att räkna sina inledande parenteser från vänster till höger.I uttrycket ((A) (B (C))) finns det till exempel fyra sådana grupper:

1

((A) (B (C)))

2

(A)

3

(B (C))

4

(C)

Grupp noll står alltid för hela uttrycket.

Fångande grupper är så benämnda eftersom varje sekvens av ingångssekvensen som matchar en sådan grupp sparas under en matchning. Den fångade sekvensen kan användas senare i uttrycket, via en bakreferens, och kan också hämtas från matcharen när matchningsoperationen är klar.

Gruppnamn

En fångningsgrupp kan också tilldelas ett ”namn”, en namngiven grupp, och sedan refereras tillbaka med ”namnet”. Gruppnamn består av följande tecken. Den första karaktären måste vara en bokstav.

En namngiven grupp är fortfarande numrerad enligt beskrivningen i gruppnummer.

Den fångade ingången som är associerad med en grupp är alltid den följd som gruppen senast matchade. Om en grupp utvärderas en andra gång på grund av kvantifiering behålls dess tidigare fångade värde, om någon, om den andra utvärderingen misslyckas. Om du till exempel matchar strängen ”aba” mot uttrycket (a (b)?) +, Blir grupp två inställd på ”b”. All inspelad inspelning kastas i början av varje match.

Grupper som börjar med (? är antingen rena, icke-fångande grupper som inte fångar text och räknas inte med i gruppens totala grupp eller namngavsgrupp.

Unicode-stöd

Denna klass överensstämmer med nivå 1 i Unicode Technical Standard # 18: Unicode Regular Expression, plus RL2.1 Canonical Equivalents.

Unicode escape-sekvenser som \ u2014 i Java-källkod bearbetas som beskrivs i avsnitt 3.3 i Java ™ språkspecifikationen. Sådana escape-sekvenser implementeras också direkt av parser med reguljärt uttryck så att Unicode-räddningar kan användas i uttryck som läses från filer eller från tangentbordet. Således är strängarna ” \ u2014 ”och” \\ u2014 ”, medan de inte är lika, sammanställs i samma mönster som matchar tecknet med hexadecimalt värde 0x2014.

Ett Unicode-tecken kan också representeras i ett reguljärt uttryck med dess Hex-notation (hexadecimalt kodpunktvärde) direkt som beskrivs i konstruktion \ x {…}, för exempel kan ett kompletterande tecken U + 2011F anges som \ x {2011F} istället för två på varandra följande Unicode-escape-sekvenser i surrogatparet \ uD840 \ uDD1F.

Unicode-skript, block, kategorier och binära egenskaper skrivs med \ p- och \ P-konstruktioner som i Perl. \ p {prop} matchar om ingången har fastighetsstödet, medan \ P {prop} inte matchar om ingången har den egenskapen.

Skript, block, kategorier och binära egenskaper kan användas både inom och utanför en karaktärsklass.

Skript anges antingen med prefixet Is, som i IsHiragana, eller med hjälp av script nyckelord (eller dess korta form sc) som i script=Hiragana eller sc=Hiragana.

Skriptnamnen som stöds av Pattern är giltiga skriptnamn som accepteras och definieras av UnicodeScript.forName.

Block specificeras med prefixet In, som i InMongolian, eller med hjälp av nyckelordet block (eller dess korta form blk) som i block=Mongolian eller blk=Mongolian.

Blocknamnen som stöds av Pattern är de giltiga blocknamnen som accepteras och definieras av UnicodeBlock.forName.

Kategorier kan anges med det valfria prefixet Is: Både \p{L} och \p{IsL} betecknar kategorin Unicode-bokstäver. Samma som skript och block, kategorier kan också anges med hjälp av nyckelordet general_category (eller dess korta form gc) som i general_category=Lu eller gc=Lu.

De kategorier som stöds är de av Unicode Standard i den version som anges av klassen Character. Kategorinamnen är de som definieras i standarden, både normativa och informativa.

Binära egenskaper anges med prefixet Is, som i IsAlphabetic.De binära egenskaper som stöds av Pattern är

  • Alfabetiska
  • Ideografiska
  • Letter
  • Små bokstäver
  • versaler
  • Titlecase
  • skiljetecken
  • Control
  • White_Space
  • Siffra
  • Hex_Digit
  • Noncharacter_Code_Point
  • Tilldelad

Fördefinierade karaktärsklasser och POSIX-teckenklasser överensstämmer med rekommendationen från Bilaga C: Kompatibilitetsegenskaper för Unicode-reguljärt uttryck när UNICODE_CHARACTER_CLASS -flaggan anges.

Kategorier som beter sig som java.lang.Character boolean ismethodname-metoder (förutom de föråldrade) är tillgängliga via samma \ p {prop} syntax där den angivna egenskapen har namnet javamethodname.

Jämförelse med Perl 5

Pattern -motorn utför traditionell NFA-baserad matchning med ordnad alternering som förekommer i Perl 5.

Perl-konstruktioner stöds inte av denna klass:

Konstruktioner som stöds av denna klass men inte av Perl:

  • Teckenklassförening och korsning som beskrivs ovan.

Anmärkningsvärda skillnader från Perl:

  • I Perl tolkas alltid \ 1 till \ 9 som bakreferenser; ett backslash-undkommet antal större än 9 behandlas som en bakreferens om åtminstone så många subuttryck finns, annars tolkas det, om möjligt, som en oktal flykt. I denna klass måste oktala flykt alltid börja med noll. I denna klass tolkas alltid \ 1 till \ 9 alltid som bakreferenser, och ett större antal accepteras som en bakreferens om åtminstone så många underuttryck existerar vid den punkten i det reguljära uttrycket, annars tappar parsern siffror tills siffran är mindre eller lika med det befintliga antalet grupper eller är det en siffra.

  • Perl använder g-flaggan för att begära en matchning som återupptas där den senaste matchen slutade. Denna funktion tillhandahålls implicit av klassen Matcher: Upprepade anrop av metoden find återupptas där den senaste matchen slutade, såvida inte matcharen återställs.

  • I Perl påverkar inbäddade flaggor på den övre nivån i ett uttryck hela uttrycket. I den här klassen träder inbäddade flaggor alltid i kraft vid den punkt där de visas, oavsett om de befinner sig på toppnivå eller inom en grupp; i det senare fallet återställs flaggor i slutet av gruppen precis som i Perl.

För en mer exakt beskrivning av beteendet hos reguljära expressionskonstruktioner, se Mastering Regular Expressions, 3: e upplagan, Jeffrey EF Friedl, O ”Reilly and Associates, 2006.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *