Kuvio (Java Platform SE 7)
Käännetty esitys säännöllisestä lausekkeesta.
Säännöllinen lauseke, joka on määritetty merkkijonoksi, on ensin koottava tämän luokan ilmentymään. Tuloksena olevaa mallia voidaan sitten käyttää luomaan Matcher
-objekti, joka voi sovittaa mielivaltaisia -merkkijonoja
säännöllistä lauseketta vastaan. Kaikki ottelun suorittamiseen osallistunut valtio asuu ottelussa, joten monet ottelijat voivat jakaa saman mallin.
Tyypillinen kutsusekvenssi on siis
Pattern p = Pattern.("a*b"); Matcher m = p.("aaaaab"); boolean b = m.();
Tämä luokka määrittää matches
-menetelmän mukavuudeksi, kun säännöllistä lauseketta käytetään vain kerran. Tämä menetelmä kokoaa lausekkeen ja sovittaa syötesekvenssin sitä vastaan yhdellä kutsulla. Lauseke
boolean b = Pattern.matches("a*b", "aaaaab");
vastaa yllä olevia kolmea lausetta, vaikka toistuvissa otteluissa se on vähemmän tehokas, koska se ei salli käännetyn mallin uudelleenkäyttöä.
Tämän luokan esiintymät ovat muuttumattomia ja turvallisia käyttää useita samanaikaisia ketjuja. Matcher
-luokan esiintymät eivät ole turvallisia tällaiseen käyttöön.
Yhteenveto säännöllisen lausekkeen rakenteista
Palautusviivat, pakot ja lainaukset
Takaisinkytkentämerkki (”\”) tuo esiin pakenevat rakenteet, kuten määritelty yllä olevassa taulukossa sekä lainata merkkejä, jotka muuten tulkitaan väistämättömiksi rakenteiksi. Täten lauseke \\ vastaa yhtä käänteistä viivaa ja \ {vastaa vasenta aaltosulkua.
On virhe käyttää taaksepäin viivaa ennen aakkosmerkkiä, joka ei tarkoita pakenevaa rakennetta; nämä on varattu säännöllisen lausekkeen kielen tuleville laajennuksille. Takaviivaa voidaan käyttää ennen ei-aakkosellista merkkiä riippumatta siitä, onko kyseinen merkki osa välttämätöntä rakennetta.
merkkijono-litaleissa, jotka edustavat säännöllisiä lausekkeita suojaamaan niitä Java-tavukoodikääntäjän tulkinnoilta. Esimerkiksi merkkijono literaali ”\ b” vastaa yhtä askelpalautinta, kun se tulkitaan säännölliseksi lausekkeeksi, kun taas ”\\ b” vastaa sanarajaa. Merkkijono kirjaimellinen ”\ (hei \)” on laiton ja johtaa kääntöaikavirheeseen; merkkijonon (hei) sovittamiseksi on käytettävä merkkijonon kirjainta ”\\ (hei \\)”.
Merkkiluokat
Merkkiluokat voivat esiintyä muissa merkkiluokissa, ja ne voivat koostua unionioperaattorista (implisiittinen) ja leikkausoperaattorista (& &). Unionioperaattori tarkoittaa luokkaa, joka sisältää kaikki merkit, jotka ovat ainakin yhdessä operandiluokistaan. Risteysoperaattori tarkoittaa luokkaa, joka sisältää kaikki molemmissa operandiluokissa olevat merkit.
Merkkiluokkaoperaattoreiden etusija on seuraava, korkeimmasta pienimpään:
1 Kirjaimellinen paeta \ x 2 Ryhmittely 3 Alue az 4 unioni 5 Risteys ]
Huomaa, että merkkiluokan sisällä on käytössä erilainen metamerkkijoukko hahmoluokka. Esimerkiksi säännöllinen lauseke. menettää erityis merkityksensä merkkiluokassa, kun taas lausekkeesta – tulee metakkarin muodostava alue.
Rivinpäätteet
Linjan pääte on yhden tai kahden merkin sekvenssi, joka merkitsee syötetyn merkkijonon rivin loppua. Seuraavat tunnistetaan rivinvaihtajiksi:
Jos UNIX_LINES
-tila on aktivoitu, ainoat tunnistetut rivin päätteet ovat uuden rivin merkkejä.
Säännöllinen lauseke. vastaa mitä tahansa merkkiä paitsi rivinvaihtaja, ellei DOTALL
-lippua määritetä.
Oletusarvoisesti säännölliset lausekkeet ^ ja $ ohittavat rivinvaihtajat ja sopivat vastaavasti vastaavasti koko syötesarjan alkuun ja loppuun. Jos MULTILINE
-tila on aktivoitu, ^ vastaa syötteen alussa ja minkä tahansa rivinvaihtajan jälkeen paitsi syötteen lopussa. MULTILINE
-tilassa $ täsmää juuri ennen rivinvaihtajaa tai syötesarjan loppua.
Ryhmät ja sieppaus
Ryhmän numero
Sieppaavat ryhmät numeroidaan laskemalla niiden avaavat sulut vasemmalta oikealle.Esimerkiksi lausekkeessa ((A) (B (C))) on neljä tällaista ryhmää:
1 ((A) (B (C)))
2 (A)
3 (B (C))
4 (C)
Ryhmä nolla tarkoittaa aina koko lauseketta.
Sieppaavat ryhmät on nimetty siten, että ottelun aikana jokainen tällaista ryhmää vastaava syöttösekvenssin peräkirja tallennetaan. Siepattua jatko-osaa voidaan käyttää myöhemmin lausekkeessa takaviitteen avulla, ja se voidaan myös noutaa ottelijasta, kun otteluoperaatio on valmis.
Ryhmän nimi
Sieppausryhmälle voidaan myös antaa ”nimi”, nimetty sieppausryhmä, ja sitten ”viite” voi viitata siihen myöhemmin. Ryhmien nimet koostuvat seuraavista merkeistä. Ensimmäisen merkin on oltava kirjain.
Nimetty sieppausryhmä numeroidaan edelleen ryhmän numerossa kuvatulla tavalla.
Ryhmään liittyvä siepattu syöte on aina osajoukko, jonka ryhmä viimeksi sovitti. Jos ryhmää arvioidaan toisen kerran kvantitoinnin vuoksi, sen aiemmin talteen otettu arvo, jos sellainen on, säilyy, jos toinen arviointi epäonnistuu. Esimerkiksi merkkijonon ”aba” sovittaminen lausekkeeseen (a (b)?) + + Jättää ryhmän kaksi asetetuksi ”b”: ksi. Kaikki kaapatut syötteet hylätään jokaisen ottelun alussa.
Ryhmät, jotka alkavat (? ovat joko puhtaita, sieppaamattomia ryhmiä, jotka eivät sieppaa tekstiä tai eivät laske ryhmän kokonaismäärään, tai nimettyjä sieppaavia ryhmiä.
Unicode-tuki
Tämä luokka on yhdenmukainen Unicode-teknisen standardin nro 18 tason kanssa: Unicode-säännöllinen lauseke ja RL2.1-kanoniset vastineet.
Unicode-pakosarjat, kuten \ u2014 Java-lähdekoodissa käsitellään Java ™ -kielten määrittelyn osiossa 3.3 kuvatulla tavalla. Tällaiset pakosarjat toteutetaan myös säännöllisen lausekkeen jäsentäjällä, jotta Unicode-pakotteita voidaan käyttää lausekkeissa, jotka luetaan tiedostoista tai näppäimistöltä. \ u2014 ”ja” \\ u2014 ”, vaikka ne eivät olekaan yhtä suuria, kääntyvät samaan kuvioon, joka vastaa merkkiä heksadesimaaliarvolla 0x2014.
Unicode-merkki voidaan myös esittää säännöllisessä lausekkeessa käyttämällä sen Hex-merkintä (heksadesimaalinen koodipistearvo) suoraan, kuten on kuvattu rakenteessa \ x {…} esimerkiksi lisämerkki U + 2011F voidaan määrittää nimellä \ x {2011F} korvaavan parin \ uD840 \ uDD1F kahden peräkkäisen Unicode-pakosarjan sijaan.
Unicode-komentosarjat, lohkot, luokat ja binaariset ominaisuudet kirjoitetaan \ p- ja \ P-rakenteilla kuten Perlissä. \ p {prop} vastaa, jos syötteellä on ominaisuus prop, kun taas \ P {prop} ei täsmää, jos syötteellä on kyseinen ominaisuus.
Skriptejä, lohkoja, luokkia ja binaarisia ominaisuuksia voidaan käyttää sekä merkkiluokan sisällä että ulkopuolella.
Skriptit määritetään joko etuliitteellä Is
, kuten kohdassa IsHiragana
, tai käyttämällä script
avainsana (tai sen lyhyt muoto sc
) kuten script=Hiragana
tai sc=Hiragana
.
Pattern
-tukikomentonimet ovat kelvollisia komentosarjojen nimiä, jotka UnicodeScript.forName
hyväksyy ja määrittelee.
Lohkot määritetään etuliitteellä In
, kuten kohdassa InMongolian
, tai käyttämällä avainsanaa block
(tai sen lyhyt muoto blk
) kuten kohdassa block=Mongolian
tai blk=Mongolian
.
Lohkojen nimet, joita Pattern
tukee, ovat kelvollisia lohkojen nimiä, jotka UnicodeBlock.forName
hyväksyy ja määrittelee.
Luokat voidaan määrittää valinnaisella etuliitteellä Is
: Sekä \p{L}
että \p{IsL}
tarkoittaa Unicode-kirjainten luokkaa. Samat kuin komentosarjat ja lohkot, luokat voidaan määrittää myös käyttämällä avainsanaa general_category
(tai sen lyhyttä muotoa gc
) kuin kohdassa general_category=Lu
tai gc=Lu
.
Tuetut luokat ovat Unicode-standardin luokkia Character
-luokan määrittämässä versiossa. Luokanimet ovat standardissa määriteltyjä, sekä normatiivisia että informatiivisia.
Binaariset ominaisuudet määritetään etuliitteellä Is
, kuten kohdassa IsAlphabetic
.Pattern
: n tukemat binaariset ominaisuudet ovat
- aakkoset
- ideologiset
- kirjaimet
- pienet kirjaimet
- isot kirjaimet
- otsikoteksti
- välimerkit
- hallinta
- valkoinen_väli
- Numero
- Hex_Digit
- Noncharacter_Code_Point
- Määritetty
Ennalta määritetyt merkkiluokat ja POSIX-merkkiluokat ovat yhdenmukaisia Liite C: Unicode-säännöllisen lausekkeen yhteensopivuusominaisuudet, kun UNICODE_CHARACTER_CLASS
-lippu on määritetty.
Luokat, jotka käyttäytyvät kuten java.lang.Chacter-boolen ismethodname -menetelmät (lukuun ottamatta vanhentuneita), ovat käytettävissä saman \ p {prop} -syntaksin kautta, jossa määritetyllä ominaisuudella on nimi javamethodname.
Vertailu Perl 5: ään
Pattern
-moottori suorittaa perinteisen NFA-pohjaisen sovituksen järjestetyllä vuorottelulla, kuten Perl 5: ssä tapahtuu.
Perl-rakenteet, joita tämä luokka ei tue:
Rakenteet, joita tämä luokka tukee, mutta Perl ei tue:
-
Merkkiluokan liitos ja leikkaus kuvatulla tavalla yllä.
Huomattavat erot Perlistä:
-
Perlissä \ 1 – \ 9 tulkitaan aina takaviitteinä; yli 9 taaksepäin viivoitettua numeroa pidetään takaviitteenä, jos ainakin niin monta alilauseketta on olemassa, muuten se tulkitaan mahdollisuuksien mukaan oktaaliparannukseksi. Tässä luokassa oktaalipäästöjen on aina aloitettava nollalla. Tässä luokassa \ 1 – \ 9 tulkitaan aina takaviitteinä, ja suurempi luku hyväksytään takaisinviitteeksi, jos säännöllisen lausekkeen siinä kohdassa on ainakin niin monta alilausetta, muuten jäsennin pudottaa numeroita numeroon on pienempi tai yhtä suuri kuin olemassa oleva ryhmien lukumäärä tai se on yksi numero.
-
Perl pyytää g-lippua ottelun, joka jatkuu siitä kohdasta, josta viimeinen ottelu päättyi. Tämän toiminnon tarjoaa implisiittisesti
Matcher
-luokka: Menetelmänfind
toistuvat kutsut jatketaan siitä kohdasta, josta viimeinen ottelu loppui, ellei ottelija on nollattu. -
Perlissä lausekkeen ylätasolla olevat upotetut liput vaikuttavat koko lausekkeeseen. Tässä luokassa upotetut liput tulevat voimaan aina siinä paikassa, missä ne esiintyvät, olivatpa ne ylimmällä tasolla tai ryhmän sisällä; jälkimmäisessä tapauksessa liput palautetaan ryhmän loppuun aivan kuten Perlissä.
Tarkemman kuvauksen säännöllisen lausekkeen rakenteiden toiminnasta, katso Mastering Regular Expressions, 3. painos, Jeffrey EF Friedl, O ”Reilly and Associates, 2006.