Pattern (Java Platform SE 7)

Een gecompileerde weergave van een reguliere expressie.

Een reguliere expressie, gespecificeerd als een string, moet eerst worden gecompileerd in een instantie van deze klasse. Het resulterende patroon kan vervolgens worden gebruikt om een Matcher -object te maken dat kan overeenkomen met willekeurige tekenreeksen tegen de reguliere expressie. Alle staten die betrokken zijn bij het uitvoeren van een match, bevinden zich in de matcher, dus veel matchers kunnen hetzelfde patroon delen.

Een typische aanroepsequentie is dus

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

Een matches -methode wordt door deze klasse gedefinieerd als een gemak voor wanneer een reguliere expressie maar één keer wordt gebruikt. Deze methode compileert een uitdrukking en vergelijkt er een invoerreeks mee in een enkele aanroep. De instructie

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

is gelijk aan de drie bovenstaande instructies, voor herhaalde overeenkomsten is het echter minder efficiënt omdat het niet toestaat dat het gecompileerde patroon opnieuw wordt gebruikt.

Instanties van deze klasse zijn onveranderlijk en kunnen veilig worden gebruikt door meerdere gelijktijdige threads. Instanties van de Matcher klasse zijn niet veilig voor dergelijk gebruik.

Samenvatting van constructies met reguliere expressies

Backslashes, escapes en citaten

Het backslash-teken (“\”) dient om escapeconstructies te introduceren, zoals gedefinieerd in de bovenstaande tabel, evenals om karakters aan te halen die anders geïnterpreteerd zouden worden als constructies zonder escapecodes. De uitdrukking \\ komt dus overeen met een enkele backslash en \ {komt overeen met een linkse accolade.

Het is een fout om een backslash te gebruiken voorafgaand aan een alfabetisch teken dat geen escapeconstructie aangeeft; deze zijn gereserveerd voor toekomstige uitbreidingen van de reguliere expressietaal. Een backslash kan vóór een niet-alfabetisch teken worden gebruikt, ongeacht of dat teken deel uitmaakt van een constructie zonder escapecodes.

Backslashes binnen letterlijke tekenreeksen in Java-broncode worden geïnterpreteerd zoals vereist door de Java ™ Language Specification als ofwel Unicode-escapes (paragraaf 3.3) of andere karakter-escapes (paragraaf 3.10.6). Het is daarom noodzakelijk om backslashes te verdubbelen in letterlijke tekenreeksen die reguliere expressies vertegenwoordigen om ze te beschermen tegen interpretatie door de Java bytecode-compiler. De letterlijke tekenreeks “\ b” komt bijvoorbeeld overeen met een enkel backspace-teken wanneer deze wordt geïnterpreteerd als een reguliere expressie, terwijl “\\ b” overeenkomt met een woordgrens. De letterlijke tekenreeks “\ (hallo \)” is ongeldig en leidt tot een compileerfout; om de string (hallo) overeen te laten komen, moet de letterlijke string “\\ (hallo \\)” worden gebruikt.

Tekenklassen

Tekenklassen kunnen voorkomen in andere tekenklassen, en kunnen worden samengesteld door de unie-operator (impliciet) en de intersectie-operator (& &). De union-operator geeft een klasse aan die elk teken bevat dat zich in ten minste één van de operandklassen bevindt. De doorsnijdingsoperator geeft een klasse aan die elk teken bevat dat in beide operandklassen voorkomt.

De prioriteit van tekenklasse-operatoren is als volgt, van hoog naar laag:

1 Letterlijke ontsnapping \ x
2 Groepering
3 Bereik az
4 Samenhang
5 Kruising ]

Merk op dat een andere set metatekens van kracht is binnen een tekenklasse dan buiten een karakter klasse. Bijvoorbeeld de reguliere expressie. verliest zijn speciale betekenis binnen een karakterklasse, terwijl de uitdrukking – een bereikvormend metateken wordt.

Lijnafsluiters

Een lijnafsluiter is een reeks van één of twee tekens die het einde van een regel van de ingevoerde tekenreeks aangeeft. De volgende worden herkend als regelafsluiters:

Als de UNIX_LINES -modus is geactiveerd, zijn de enige herkende regelafsluiters de tekens voor nieuwe regels.

De reguliere expressie. komt overeen met elk teken behalve een regelterminator, tenzij de vlag DOTALL is opgegeven.

Standaard negeren de reguliere expressies ^ en $ regelafsluiters en komen alleen overeen aan respectievelijk het begin en het einde van de volledige invoerreeks. Als de MULTILINE -modus is geactiveerd, komt ^ overeen aan het begin van de invoer en na elke regelafsluiter behalve aan het einde van de invoer. Wanneer in MULTILINE modus $ overeenkomt net voor een regelafsluiter of het einde van de invoerreeks.

Groepen en vastleggen

Groepsnummer

Overgenomen groepen worden genummerd door hun openingshaakjes van links naar rechts te tellen.In de uitdrukking ((A) (B (C))) zijn er bijvoorbeeld vier van dergelijke groepen:

1

((A) (B (C)))

2

(A)

3

(B (C))

4

(C)

Groep nul staat altijd voor de hele uitdrukking.

Capturing-groepen worden zo genoemd omdat tijdens een match elke subreeks van de invoersequentie die overeenkomt met een dergelijke groep wordt opgeslagen. De ingevangen subreeks kan later in de uitdrukking worden gebruikt, via een backreferentie, en kan ook worden opgehaald uit de matcher zodra de matchbewerking is voltooid.

Groepsnaam

Een vastleggende groep kan ook een “naam” worden toegewezen, een benoemde vastleggende groep, en er kan later naar worden verwezen met de “naam”. Groepsnamen zijn samengesteld uit de volgende karakters. Het eerste teken moet een letter zijn.

Een groep die de naam vastlegt, wordt nog steeds genummerd zoals beschreven in Groepsnummer.

De vastgelegde invoer die aan een groep is gekoppeld, is altijd de subreeks waarmee de groep het laatst overeenkwam. Als een groep een tweede keer wordt geëvalueerd vanwege kwantificering, wordt de eerder vastgelegde waarde, indien aanwezig, behouden als de tweede evaluatie mislukt. Als u bijvoorbeeld de tekenreeks “aba” vergelijkt met de uitdrukking (a (b)?) +, Blijft groep twee ingesteld op “b”. Alle vastgelegde invoer wordt aan het begin van elke wedstrijd weggegooid.

Groepen die beginnen met (? zijn ofwel pure, niet-capturing-groepen die geen tekst opvangen en niet meetellen voor het groepstotaal, of de benoemde capturing-groep.

Unicode-ondersteuning

Deze klasse is in overeenstemming met Level 1 van Unicode Technical Standard # 18: Unicode Regular Expression, plus RL2.1 Canonical Equivalents.

Unicode-escape-reeksen zoals \ u2014 in Java-broncode worden verwerkt zoals beschreven in sectie 3.3 van The Java ™ Language Specification. Dergelijke escape-reeksen worden ook direct geïmplementeerd door de reguliere expressie-parser, zodat Unicode-escapes kunnen worden gebruikt in expressies die worden gelezen uit bestanden of vanaf het toetsenbord. Dus de strings \ u2014 “en” \\ u2014 “, hoewel niet gelijk, compileren in hetzelfde patroon, dat overeenkomt met het teken met de hexadecimale waarde 0x2014.

Een Unicode-teken kan ook in een reguliere expressie worden weergegeven door zijn Hex-notatie (hexadecimale codepuntwaarde) direct zoals beschreven in construct \ x {…}, voor Voorbeeld: een aanvullend teken U + 2011F kan worden opgegeven als \ x {2011F}, in plaats van twee opeenvolgende Unicode-escape-reeksen van het surrogaatpaar \ uD840 \ uDD1F.

Unicode-scripts, blokken, categorieën en binaire eigenschappen worden geschreven met de constructies \ p en \ P zoals in Perl. \ p {prop} komt overeen als de invoer de eigenschap prop heeft, terwijl \ P {prop} niet overeenkomt als de invoer die eigenschap heeft.

Scripts, blokken, categorieën en binaire eigenschappen kunnen zowel binnen als buiten een tekenklasse worden gebruikt.

Scripts worden gespecificeerd met het voorvoegsel Is, zoals in IsHiragana, of door de script zoekwoord (of de korte vorm sc) zoals in script=Hiragana of sc=Hiragana.

De scriptnamen die worden ondersteund door Pattern zijn de geldige scriptnamen die worden geaccepteerd en gedefinieerd door UnicodeScript.forName.

Blokken worden gespecificeerd met het voorvoegsel In, zoals in InMongolian, of door het trefwoord block (of de korte vorm blk) zoals in block=Mongolian of blk=Mongolian.

De bloknamen die worden ondersteund door Pattern zijn de geldige bloknamen die geaccepteerd en gedefinieerd zijn door UnicodeBlock.forName.

Categorieën kunnen worden gespecificeerd met het optionele voorvoegsel Is: zowel \p{L} als \p{IsL} duiden de categorie Unicode-letters aan. Hetzelfde als scripts en blokken, categorieën kunnen ook worden gespecificeerd door het trefwoord general_category (of de korte vorm gc) te gebruiken zoals in general_category=Lu of gc=Lu.

De ondersteunde categorieën zijn die van The Unicode Standard in de versie gespecificeerd door de Character klasse. De categorienamen zijn gedefinieerd in de norm, zowel normatief als informatief.

Binaire eigenschappen worden gespecificeerd met het voorvoegsel Is, zoals in IsAlphabetic.De ondersteunde binaire eigenschappen door Pattern zijn

  • Alfabetisch
  • Ideografisch
  • Letter
  • Kleine letters
  • Hoofdletters
  • Titlecase
  • Interpunctie
  • Controle
  • White_Space
  • Cijfer
  • Hex_Digit
  • Noncharacter_Code_Point
  • Toegewezen

Voorgedefinieerde karakterklassen en POSIX-tekenklassen zijn in overeenstemming met de aanbeveling van Bijlage C: Compatibiliteitseigenschappen van Unicode Regular Expression, wanneer de vlag UNICODE_CHARACTER_CLASS is opgegeven.

Categorieën die zich gedragen als de java.lang.Character boolean ismethodname-methoden (behalve de verouderde methoden) zijn beschikbaar via dezelfde \ p {prop} syntaxis waar de opgegeven eigenschap de naam javamethodname heeft.

Vergelijking met Perl 5

De Pattern engine voert traditionele NFA-gebaseerde afstemming uit met geordende afwisseling zoals gebeurt in Perl 5.

Perl-constructies die niet worden ondersteund door deze klasse:

Constructies die worden ondersteund door deze klasse maar niet door Perl:

  • Karakter-klasse vereniging en intersectie zoals beschreven hierboven.

Opmerkelijke verschillen met Perl:

  • In Perl worden \ 1 tot en met \ 9 altijd geïnterpreteerd als oude verwijzingen; een getal met een backslash-escapet groter dan 9 wordt behandeld als een back-reference als er tenminste zoveel subexpressies bestaan, anders wordt het, indien mogelijk, geïnterpreteerd als een octale escape. In deze klasse moeten octale escapes altijd beginnen met een nul. In deze klasse worden \ 1 tot en met \ 9 altijd geïnterpreteerd als back-referenties, en een groter aantal wordt geaccepteerd als een back-referentie als er op dat punt in de reguliere expressie tenminste zoveel subexpressies bestaan, anders laat de parser cijfers vallen tot het nummer is kleiner of gelijk aan het bestaande aantal groepen of het is één cijfer.

  • Perl gebruikt de vlag g om een wedstrijd aan te vragen die wordt hervat waar de laatste wedstrijd was gestopt. Deze functionaliteit wordt impliciet geleverd door de Matcher -klasse: Herhaalde aanroepen van de find -methode worden hervat waar de laatste match was gebleven, tenzij de matcher wordt gereset.

  • In Perl hebben ingesloten vlaggen op het hoogste niveau van een uitdrukking invloed op de hele uitdrukking. In deze klasse worden ingebedde vlaggen altijd van kracht op het punt waarop ze verschijnen, of ze zich nu op het hoogste niveau bevinden of binnen een groep; in het laatste geval worden vlaggen aan het einde van de groep hersteld, net als in Perl.

Voor een meer nauwkeurige beschrijving van het gedrag van constructies van reguliere expressies, zie Mastering Regular Expressions, 3de editie, Jeffrey EF Friedl, O “Reilly and Associates, 2006.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *