Sissejuhatus Juhendaja

Link: http://gnosis.cx/publish/programming/regular_expressions.html

(Tõlge: valgevene)

1

Sob lugu: See lehekülg tundub olevat üsna laialt lugeda, vaid lihtsalt aeg-ajalt saab annetusi eespool linke. Tragöödia commons ja kõik, mis… aga ikkagi, kui kõik soovid annetada buck või kaks, ma hindan seda? Igatahes, see õpetus oli esimene avaldatud IBM developerWorks. See versioon sisaldab mõningaid väiksemaid parandusi, et lugejad on soovitanud, kuna algversioon. Laiendatud ja ajakohastatud versiooni leiate minu raamat, Teksti Töötlemise Python

Kaart

2 See õpetus on lihtsalt üks suur HTML-faili, mõne graafika kasutatud mööda teed. Lihtsalt liikuge alla, et lugeda seda. Trükkimine võib murda mõned tunnid, lähis–aga siis, siis ei maksa palju, et saada see.

, Kes on see õpetus?

3 See õpetus on suunatud kasutajatele ja programmeerijad, kes on asunud tööle vahendid, et kasutada regulaaravaldisi, kuid kes ei ole päris rahul hienoudet neid. Isegi kasutajad, kes võib-olla kasutada regulaaravaldisi minevikus, kuid on unustanud mõned üksikasjad, sellest saavad kasu nii täiendkoolitus.

Pärast lõpetamist see õpetus sul ei ole veel olema ekspert, kasutades regulaaravaldisi, et parimal viisil ära. Kuid see õpetus koos palju praktika erineva juhtudel on umbes kõik, mida vaja olla ekspert. mõisted regulaaravaldiste on väga lihtne ja võimas. . . see on oma rakendus, mis võtab mõned tööd.

Lihtsalt, mis on regulaaravaldis niikuinii?

4 Loe õpetus, et saada pikk vastus. Lühike vastus on, et regulaaravaldis on kompaktne viis kirjeldada keerulisi mustreid tekstid. Võite kasutada neid otsida mustreid, ja kui leidnud, et muuta tarbimisharjumusi keerulisi viise. Neid saab kasutada ka käivitada programmilisi tegevusi, mis sõltuvad mustrid.

A tongue-in-cheek kommentaari programmeerijad on väärt mõtlemist: “Mõnikord on programmeerimise probleem ja tundub, et parim lahendus on kasutada regulaaravaldisi; nüüd on teil kaks probleemi.” regulaaravaldisi on hämmastavalt võimas ja sügavalt väljendusrikas. See on väga põhjust kirjutamiseks neid on lihtsalt nii vigu kui kirjalikult mis tahes muud keeruline programmeerimine kood. See on alati parem lahendada tõeliselt lihtne probleem lihtsal viisil; kui lähed kaugemale, lihtne, mõtle regulaaravaldisi.

Milliseid vahendeid kasutada regulaaravaldisi?

5 suur hulk vahendeid, lisada regulaaravaldisi, mis on osa nende funktsionaalsust. Unix-orienteeritud käsurea tööriistu nagu grep, sed ja awk on enamasti wrapper for regulaaravaldis töötlemine. Paljud tekstiredaktor võimaldab otsida ja/või asendamine, mis põhinevad regulaaravaldiste. Paljudes programmeerimiskeeltes, eriti skriptimine keeles (nt Perl, Python, ja TCL, ehitada regulaaravaldisi südamesse keeles. Isegi kõige käsurea kestad, näiteks Bash-või Windows-console võimaldab piirata regulaaravaldisi, mis on osa nende käsu süntaks.

Seal on mõned erinevused regulaaravaldiste süntaksi vahel erinevaid vahendeid, et neid kasutada. Mõned tööriistad lisada täiustatud võimeid, mis ei ole kõikjal kättesaadav. Üldiselt, lihtsaimal juhul käesolev õpetus kasutab näiteid põhineb umbes grep või sed. Veel mõned eksootilised võimeid, Perl või Python näited on valitud. Suurem osa näiteid, mis töötab kõikjal, kuid vaadake dokumentatsiooni, oma tööriista süntaks variante ja võimalusi.

Lisa esitlus

6 eesmärgil esitatakse näiteid selle juhendaja, regulaaravaldisi kirjeldatud on ümbritsetud nii kaldkriipsud. See stiil delimiting regulaaravaldisi on kasutusel sed, awk, perl ja muid vahendeid. Näiteks võiks mainida:

/[A-Z]+(abc|xyz)*/

Loe edasi, et mõista, see näide, nüüd lihtsalt aru, et tegelik regulaaravaldis on kõik vahelkaldkriipse.

Palju näiteid on lisatud illustratsioon, mis näitab regulaaravaldis ja teksti, mis on esile tõstetud, iga mängu kohta, mis väljendus.

Kontakt

7 David Mertz on kirjanik, programmeerija, ja õpetaja, kes alati püüab parandada oma kommunikatsiooni, et lugejad (ja juhendaja soovijaid). Ta tervitab kõiki märkusi, palun suunata neid <[email protected]>.

Kuhu minna siit…

Pärast seda, kui te täitke see õpetus siis on näha põhitõed (ja natuke mõned täpsemad teemad) regulaaravaldisi. Parim asi, mida teha järgmisena on kohe kasutama hakata päris elu probleemidega. Esimene asi, mida pilk on dokumendid, mis kaasneb eelkõige tööriist, mida kasutada. Peale selle on mitmed raamatud on head selgitused regulaaravaldisi, mis on tihti rakendatud vahendeid. Mõned raamatud looja see juhendaja on saanud kasu on:

  • Mastering regulaaravaldisi, Friedl, Jeffrey E. F., O ‘ Reilly, Cambridge, MA 1997. aastal.
  • sed & awk, Dale Dougherty & Arnold Robbins, O ‘ Reilly, Cambridge, MA 1997. aastal.
  • Programmeerimine Perl, Larry Wall, Tom Christiansen & Randal L. Schwartz, O ‘ Reilly, Cambridge, MA 1996. aastal.
  • TCL/TK lühidalt, Paul Raines & Jeff Tranter, O ‘ Reilly, Cambridge, MA 1999. aastal.
  • Pythoni Tasku Viide, Mark Lutz, O ‘ Reilly, Cambridge, MA, 1998.
  • Praktiline Juhend Linux, Mark G. Sobell, Addison Wesley, Lugemine, MA 1997. aastal.

Mustrite Sobitamine Teksti: Põhitõdesid


Character literaale

/a/

Mary had a little lamb.
And everywhere that Mary
went, the lamb was sure
to go.

/Mary/

Mary had a little lamb.
And everywhere that Mary
went, the lamb was sure
to go.
väga lihtne mustrit sobitada regulaaravaldis on otsene märk või jada sõna otseses märki. Midagi target tekst, mis koosneb täpselt need märgid täpselt, et loetletud sobib. Väiksem juhul, number ei ole sama, mis selle tähega versioon, ja vastupidi. Ruumi regulaaravaldis, mida teed, sobib sõnasõnaline ruumi eesmärk (see on kõige erinevalt programmeerimiskeelte või command-line tools, kui ruumid eraldi märksõnad).

“Pääsenud” märki literaale

/.*/

Special characters must be escaped.*

/\.\*/
Special characters must be escaped.*
märkide arv on eri tähendusi regulaaravaldisi. Sümbol eriline tähendus võib sobitada, kuid teha nii, et teil tuleb eesliide seda kurakriipsu märk (see hõlmab kurakriipsu märk ise: sobitada üks längkriips eesmärgi, oma regulaaravaldis peaks hõlmama järgmist:”\\”).

Positsiooniline erisümbolid

/^Mary/

Mary had a little lamb.
And everywhere that Mary
went, the lamb was sure
to go.

/Mary$/

Mary had a little lamb.
And everywhere that Mary
went, the lamb was sure
to go.
Kaks erimärgid, mida kasutatakse peaaegu kõigi regulaaravaldis vahendeid, et kaubamärgi alguses ja lõpus rida: caret (^) ja dollarsign ($). Sobitada caret või dollarsign nagu sõnasõnaline märk, sa pead põgeneda (st enne seda kurakaldkriipsuga “\”).

Huvitav asi caret ja dollarsign on see, et need sobivad null-laiusega mustrid. Mis on pikkus string vastanud caret või dollarsign ise on null (kuid ülejäänud regulaaravaldis võib ikka sõltub null-laius vaste). Paljud regulaaravaldis vahendeid anda teine null-laius mustri sõna-piir (\b). Sõnad võivad olla jagatud tühimärkide nagu ruumid, klapid, reavahetused, või muid sümboleid, näiteks nulls; sõna-piiri muster sobib tegelik koht kus sõna algab või lõpeb, ei ole eriti tühimärkide tegelased.

“lühend” märk

/.a/ 

Mary had a little lamb.
And everywhere that Mary
went, the lamb was sure
to go.
regulaaravaldisi, mille jooksul võib kandideerida iga märk. Tavaliselt reavahetuse märki ei kuulu, kuid enamik vahendeid on kohustuslik lülitub jõu lisamine reavahetuse märki ka. Kasutades jooksul muster on nii, nõudes, et “midagi” juhtub siin, ilma et otsustada, millist.

Kasutajad, kes on tuttavad DOS käsurea metamärgid teavad küsimus-märgi täites rolli “mõned märk” käsk maskid. Kuid regulaaravaldisi, küsimus-märk on erinev tähendus, ja periood on kasutada metamärki.

Rühmitus regulaaravaldisi

/(Mary)( )(had)/ 

Mary had a little lamb.
And everywhere that Mary
went, the lamb was sure
to go.
regulaaravaldis võib olla sõna otseses tähemärki seda, ja ka null-laius positsiooniline mustrid. Iga sõnasõnaline iseloomu või positsiooniline muster on atom regulaaravaldis. Sul võib olla ka rühm mitu aatomit koos võetud väike regulaaravaldis, mis on osa suuremast regulaaravaldis. Võiks olla valmis, et helistada selline rühmitus “molekul”, kuid tavaliselt seda nimetatakse ka aatomi.

Vanemate Unix-orienteeritud vahendid nagu grep, subexpressions peavad olema grupeeritud pääsenud sulgudes, nt /\(Maarja\)/. Selles Perl ja kõige uuemaid tööriistu (sealhulgas egrep), rühmitamine on teinud paljaste sulgudes, kuid sobitamine sõnasõnaline sulu paarilise juurde vaja põgenedes see muster (näiteks pool tuleneb, Perl).

märgiklassides

/[a-z]a/ 

Mary had a little lamb.
And everywhere that Mary
went, the lamb was sure
to go.
Mitte ainult nimi tegelasel, saate lisada muster regulaaravaldis, mis sobib mis tahes märkide.

Märkide saab anda lihtne loetelu, sees nurksulgudes, näiteks /[aeiou]/ ei sobi ükski suur-täishäälik. Ette täht või number ulatub te võite kasutada ka ainult esimene ja viimane täht vahemikus, kriips keskel, nt /[A-Ma-m]/ on täpselt kõik väiksed või suured esimesel poolel tähestikku.

Paljud regulaaravaldis vahendid annavad ka põgeneda stiilis otseteed kõige sagedamini kasutatavate iseloomu, klassi, näiteks \sa tühimärkide iseloomu ja \d numbrit. Sa võid alati määratleda nende tegelaste klassid koos nurksulgudega, kuid otseteed saab teha regulaaravaldisi kompaktsem ja paremini loetav.

Täiendab käitaja

/[^a-z]a/ 

Mary had a little lamb.
And everywhere that Mary
went, the lamb was sure
to go.
caret sümbol võib tegelikult olla kaks erinevat tähendust regulaaravaldisi. Enamiku ajast, see tähendab, et sobitada null-pikkusega muster liini algus. Aga kui see on alguses kasutatud iseloomu, klassi, see teistpidi tähenduses tegelase klassi. Kõik ei lisada loetletud märgistik on sobitada.

Vaheldumine mustrid

/cat|dog|bird/

The pet store sold cats, dogs, and birds.

/=first|second=/

=first first= # =second second= # =first= # =second=

/(=)(first)|(second)(=)/

=first first= # =second second= # =first= # =second=

/=(first|second)=/

=first first= # =second second= # =first= # =second=
Kasutades tegelaste klassid on vahend, mis näitab, et kas üks asi või teine asi võib esineda eelkõige kohapeal. Kuid mida teha, kui soovite määrata, et kas kaks kogu subexpressions esineda positsiooni regulaaravaldis? Et sul on kasutada vaheldumine ettevõtja, vertikaalne riba (“|”). See on sümbol, mida kasutatakse ka näidata toru Unix/DOS kestad, ja nimetatakse mõnikord toru iseloomu.

Toru märk regulaaravaldis näitab vaheldumine vahel kõik rühma ümbritseva seda. See tähendab, et isegi juhul, kui on mitu gruppi, et vasakul ja paremal pool toru iseloomu vaheldumine aplalt küsib kõike mõlemalt poolt. Et valida reguleerimisala vaheldumine, peate määrama rühm, mis hõlmab mustreid, mis võivad vastata. Näide illustreerib seda.

basic abstraktse quantifier

/@(=#=)*@/ 

Match with zero in the middle: @@
Subexpresion occurs, but...: @=#[email protected]
Lots of occurrences: @=#==#==#==#==#[email protected]
Must repeat entire pattern: @=#==#=#==#[email protected]
Üks kõige võimsam ja ühiseid asju, mida saate teha koos regulaaravaldisi on määrata, mitu korda aatom tekib täielik regulaaravaldis. Mõnikord soovite määrata midagi esinemise tegelasel, kuid väga sageli olete huvitatud, täpsustades esinemise iseloomu, klassi või rühmitatud subexpression.

On ainult üks quantifier kaasas “basic” regulaaravaldiste süntaksi, tärniga (“*”); inglise keeles, see on tähenduses “mõned või ei” või “null või rohkem.” Kui soovite määrata, et mis tahes arvu, aatomi võib ilmneda juhul, kui osa muster, järgige atom tärniga.

Ilma quantifiers, rühmitamine väljendeid tegelikult ei teeni nii palju, eesmärk, aga kui meil saab lisada quantifier, et subexpression saame öelda midagi toimumise subexpression tervikuna. Heitke pilk näide.

Mustrite Sobitamine Teksti: Vahe


Rohkem abstraktne quantifiers

/A+B*C?D/

AAAD
ABBBBCD
BBBCD
ABCCD
AAABBBC
teatud viisil, puudub igasugune quantifier sümbol pärast aatom kvantifitseeritakse atom ikkagi: ta ütleb atom toimubtäpselt üks kord. Laiendatud regulaaravaldisi (mida enamik tööriistu toetada) lisada mõned muud kasulikud numbrid, et “kui täpselt” ja “null või enam korda.” Pluss-märgiga (“+”) tähendab “üks või mitu korda” ja küsimus-märgiga (“?”) tähendab “null või üks korda.” Need quantifiers on kaugelt kõige levinum loendid olete likvideerida nime.

Kui järele mõelda, siis näete, et laiendatud regulaaravaldisi ei ole tegelikult teile “öelda” midagi, põhilised neist ei ole. Nad lihtsalt teile öelda, et see on lühem ja selgem viis. Näiteks, “(ABC)+” on võrdne “(ABC)(ABC)*” ja “X(ABC)?Y” on võrdne “XABCY|XY“. Kui aatomid on kvantifitseeritud on ise keeruline rühmitatud subexpressions küsimus-mark ja pluss-märgi saavad asjad palju lühem.

Numbriline quantifiers

/a{5} b{,6} c{4,8}/

aaaaa bbbbb ccccc
aaa bbb ccc
aaaaa bbbbbbbbbbbbbb ccccc

/a+ b{3,} c?/

aaaaa bbbbb ccccc
aaa bbb ccc
aaaaa bbbbbbbbbbbbbb ccccc

/a{5} b{6,} c{4,8}/

aaaaa bbbbb ccccc
aaa bbb ccc
aaaaa bbbbbbbbbbbbbb ccccc
Kasutate laiendatud regulaaravaldisi, saate määrata suvalise mustri esinemise loeb kasutades rohkem verbose süntaks kui küsimus-mark, pluss-märki ning tärn quantifiers. Lokkis-traksid (“{” ja “}”) saab ümbritsevad täpset arvu, kui palju vahejuhtumeid, mida otsite.

Kõige üldisem vorm lokkis-traksidega kvantifitseerimine kasutab kahte valikut argumendid (esimene ei tohi olla suurem kui teine, ja mõlemad peavad olema mitte-negatiivsed täisarvud). Esinemise arv on määratud käesoleva viis kuulu vahel minimaalse ja maksimaalse märgitud (kaasa arvatud). Nagu sama, kas argument võib tühjaks jääda: kui nii minimaalse/maksimaalse on määratud null/infinity, vastavalt. Kui ainult üks argument on kasutatud (ei ole koma seal), täpselt, et juhtumite arvuks on sobitada.

Backreferences

/(abc|xyz) \1/

jkl abc xyz
jkl xyz abc
jkl abc abc
jkl xyz xyz

/(abc|xyz) (abc|xyz)/

jkl abc xyz
jkl xyz abc
jkl abc abc
jkl xyz xyz
Üks võimas võimalus luua otsi mustreid on täpsustades, et subexpression, mis oli sobitatud varem regulaaravaldis on sobitatud hiljem uuesti väljendamine. Me teeme seda kasutades backreferences. Backreferences on nimeks numbrid 1 kuni 9, millele eelneb edastada kaldkriips/paomärk kui kasutada sellisel viisil. Need backreferences vaadake iga järgneva grupi matši muster, nagu /(ühe)(kaks)(kolm)/\1\2\3/. Iga nummerdatud backreference viitab rühmale, et selles näites on sõna, mis vastavad numbrile.

On oluline märkida, midagi näide illustreerib. Mida saab sobitada poolt backreference on sama sõna otseses string sobitada esimese aeg, isegi siis, kui muster, mis sobitatakse string võib olla sobitada teiste stringid. Lihtsalt korrata sama grupeeritud subexpression hiljem regulaaravaldis ei sobi samad eesmärgid nagu kasutades backreference (kuid sa pead otsustama, mis see on sa tegelikult tahad sobitada mõlemal juhul).

Backreferences vaadake tagasi iganes leidis aset eelmise rühmitatud väljendeid, et need rühmitatud väljendeid toimunud. Sest nimereeglistik (\1-\9), paljud tööriistad piirata te üheksa backreferences. Mõned vahendid võimaldavad tegelikku nimetamine backreferences ja/või säästa kuni programmi muutujad. Täpsemate osad käesoleva juhendaja touch nende teemade kohta

ei kattu rohkem, kui te soovite

/th.*s/

-- I want to match the words that start
-- with 'th' and end with 's'.
this
thus
thistle
this line matches too much
Quantifiers regulaarselt väljendeid ahne. Mis on, need sobivad nii palju, kui nad olla võivad.

Ilmselt lihtsaim viga teha rondo regulaaravaldisi on sobitada liiga palju. Kui te kasutate quantifier, sa tahad seda mängu kõik (õige sort) kuni punktini, kus soovite lõpetada oma vaste. Aga kui kasutad “*”, “+” või numbriline quantifiers, see on lihtne unustada, et viimane natuke, mida otsite, võivad tekkida hiljem joon, kui olete huvitatud.

Trikke lähenemiskeelu vastet

/th[^s]*./

-- I want to match the words that start
-- with 'th' and end with 's'.
this
thus
thistle
this line matches too much
Sageli, kui leiate, et teie regulaaravaldisi on sobitamine liiga palju, kasulik protseduur on reformulate probleem meelt. Pigem mõtlema “mida ma püüan sobitada hiljem väljendus?” küsi endalt, “mida on mul vaja, etväldi sobitamine järgmise osa?” Sageli toob see kaasa rohkem parsimonious muster sobib. Sageli, kuidas vältida muster on kasutada täiendab käitaja ja iseloomu klassi. Vaatame näiteks, ja mõtlema, kuidas see toimib.

Trikk on siin selles, et on kaks moodust kujundamisel peaaegu samas järjekorras. Võite mõelda, mida soovite säilitada sobitamine kuni saad XYZ, või sa ei mõtle, mida soovite säilitada sobitamine kui saad XYZ. Need on delikaatselt erinevad.

Inimesed, kes on mõelnud basic tõenäosus, et sama muster kordub. Võimalus rolling 6 kohta, sureb üks roll on 1/6. Milline on tõenäosus, rolling 6 kuue rullides? On naiivne arvutus paneb koefitsiendid on 1/6+1/6+1/6+1/6+1/6+1/6, või 100%. See on vale, loomulikult (pärast kõik, võimalus pärast kaksteist rullides pole 200%). Õige arvutus on “kuidas ma väldi jooksva 6 kuus veereb?” — st 5/6*5/6*5/6*5/6*5/6*5/6, või umbes 33%. Võimalus saada 6 on sama võimalus ei ole vältides ta (või umbes 66%). Tegelikult, kui te kujutate ette, transcribing seeria rullides täringut, teil võib kohaldada regulaaravaldis, et kirjalikke ülestähendusi, ja sarnane mõtteviis kehtib.

Märkused muutmise tööriistad

Mitte kõik tööriistad, mida kasutada regulaaravaldisi võimaldavad teil muuta eesmärgi stringid. Mõned lihtsalt leida tasakaalustatud muster; enamasti kasutatakse laialdaselt regulaaravaldis vahend on ilmselt grep, mis on vahend, mille abil otsida ainult. Tekstiredaktor, näiteks võib või võib mitte lubada asendamine nende regulaaravaldis otsinguvahend. Nagu alati, konsulteerida dokumentatsiooni oma individuaalset abivahendit.

Vahendeid, mis võimaldavad teil muuta eesmärgi teksti, seal on mõned erinevused meeles pidada. Kuidas sa tegelikult täpsustada, asendused on erinevad töövahendid: teksti redaktor võib olla dialoogiboksi; command-line tools kasutada piirajad vahel mängu ja asendamine, programmeerimiskeeled on tavaliselt kõne funktsioonid argumente vaste ja asendamine mustrid.

Teine oluline erinevus on meeles pidada, on, mis on saada muuta. Unix-orienteeritud command-line tools tavaliselt kasutada torude ja STDOUT muudatused, puhvrid, mitte muuta files in-place. Kasutades sed häälkäsk, näiteks, kas kirjutada muudatused konsooli, kuid ei muutu algse eesmärgi faili. Tekstiredaktor või programmeerimiskeeled on tõenäolisem, et tegelikult muuta faili-koht.

märkus muutmise näiteid

käesolevas juhendaja, näited jätkuvalt kasutada sed style slash piirajad. Konkreetselt näiteid näitab asendamise käsk ja ülemaailmse töötleja, nagu “s/see/et/g“. See väljend tähendab: “Asendada string” see “string”, ” mis igal pool target teksti.

Näited koosneb muutmise käsk, sisendrida ja väljundi rida. Output real on muudatusi rõhutada. Samuti on igal sisend/väljund, line eelneb väiksem või suurem-kui sümbol, et aidata eristada neid (selleks on, nagu on kirjeldatud ka), mis on katkule ümbersuunamine sümbolid Unix kestad.

sõnasõnaline-string muutmise näide

s/cat/dog/g 

< The zoo had wild dogs, bobcats, lions, and other wild cats.
> The zoo had wild dogs, bobdogs, lions, and other wild dogs.
võtkem pilk paar muudatust näited, et ehitada kohta, mida me oleme juba kaetud. See lihtsalt asendajad mõned sõnasõnaline tekst, mõned muud sõnasõnaline tekst. Otsi-ja-asenda võime palju vahendeid, saate seda teha palju, isegi ilma, kasutades regulaaravaldisi.

muster-match muutmise näide

s/cat|dog/snake/g 

< The zoo had wild dogs, bobcats, lions, and other wild cats.
> The zoo had wild snakes, bobsnakes, lions, and other wild snakes.

s/[a-z]+i[a-z]*/nice/g 

< The zoo had wild dogs, bobcats, lions, and other wild cats.
> The zoo had nice dogs, bobcats, nice, and other nice cats.
Enamik aega, kui te kasutate regulaarselt ilmeid, et modifitseerida target teksti, te ei taha mängu rohkem üld-mustrid kui vaid sõnasõnaline stringid. Mis iganes on sobitatud on see, mida saab vahetada (isegi kui see on mitu erinevat stringid eesmärk)

Muutmine kasutades backreferences

s/([A-Z])([0-9]{2,4}) /\2:\1 /g 

< A37 B4 C107 D54112 E1103 XXX
> 37:A B4 107:C D54112 1103:E XXX
See on tore, et oleks võimalik lisada fikseeritud string kõikjal muster esineb eesmärgi teksti. Kuid ausalt öeldes, seda, et ei ole väga kontekstitundlik. Palju kordi, me ei taha, lihtsalt paigalda fikseeritud stringid, vaid pigem selleks, et lisada midagi, mis kannab palju rohkem seoses tasakaalustatud mustrid. Õnneks backreferences tulevad meile appi siin. Saate kasutada backreferences mustri-sobib ise, kuid see on isegi rohkem kasulik, et oleks võimalik kasutada neid asendamine mustrid. Kasutades asendamine backreferences, saate valida ja valida tasakaalustatud mustrid kasutada vaid osade olete huvitatud.

Abi loetavuse subexpressions on koondatud paljaste sulgudes (nagu Perl), mitte pääsenud sulgudes (näiteks sed).

Teise hoiatuse mismatching

See õpetus on juba hoiatanud ohu samaväärse liiga palju oma regulaaravaldis mustrid. Kuid oht on nii palju raskemad, kui teete muudatusi, et see on väärt kordamist. Kui sa asendad muster, mis sobib suuremale string kui sa mõtlesid, kui sa koosnev muster, siis on potentsiaalselt välja jäetud mõned olulised andmed oma eesmärgi.

See on alati hea mõte proovida regulaaravaldiste kohta mitmekesine eesmärgi andmeid, mis on esindaja, oma tootmine ja kasutamine. Veenduge, et olete sobitamine, mida sa arvad, et sa oleksid vastavuses. Hulkuvate quantifier või lühend saab teha üllatavalt erinevaid tekste vaste mida sa arvasid oli konkreetne muster. Ja mõnikord sa lihtsalt pead vahtima oma mustrit, samal ajal, või leida muu komplekt silmi, et aru saada, mis tegelikult toimub, isegi pärast seda, kui näete, milline sobib. Tuntus võib tõug põlgust, aga ka see instills pädevusse.

Advanced regulaaravaldis Laiendused


Umbes arenenud funktsioonid

Mõned väga kasulikud lisaseadmed on lisatud mõned regulaaravaldis vahendid. Need lisaseadmed sageli teha koosseisu ja hooldus regulaaravaldis tunduvalt lihtsam. Kuid kontrollida oma tool, et näha, mida on toetatud.

Programmeerimise keelega Perl on ilmselt kõige keerukamaid vahend regulaaravaldis, töötlemis -, mis seletab palju oma populaarsust. Näidetega illustreeritud kasutab Perl-ish-koodi, et selgitada mõisteid. Muude programmeerimis keeli, eriti muud skriptid keeli nagu Python, on sarnane valik lisaseadmeid. Kuid eesmärkidel, illustratsioon, Perl on süntaks kõige tihedalt peeglid regulaaravaldise tools see põhineb, nagu näiteks s, ex, grep, sed ja awk.

Mitte-ahne quantifiers

/th.*s/

-- I want to match the words that start
-- with 'th' and end with 's'.
this line matches just right
this # thus # thistle

/th.*?s/

-- I want to match the words that start
-- with 'th' and end with 's'.
this # thus # thistle
this line matches just right

/th.*?s /

-- I want to match the words that start
-- with 'th' and end with 's'. (FINALLY!)
this # thus # thistle
this line matches just right
Varem juhendaja probleeme sobitamine liiga palju arutatud, ja mõned lahendused olid soovitanud. Mõned regulaaravaldis vahendid on kena piisavalt, et muuta see lihtsamaks, pakkudes vabatahtlik mitte-ahne quantifiers. Need quantifier haarata nii vähe kui võimalik, samas endiselt sobitamine mis iganes on järgmine muster (selle asemel, kui palju, kui võimalik).

Mitte-ahne quantifiers on sama süntaksit kui tavaline ahne need, välja arvatud juhul, kui quantifier järgneb küsimus-märgi. Näiteks mitte-ahne muster võib tunduda nagu: “/A[A-Z]*?B/“. Inglise keeles tähendab see “vaste A, millele järgneb ainult nii palju tähti, kui on vaja leida.”

Üks väike asi, mida tasub otsida on asjaolu, et muster “/[A-Z]*?./" alati vaste nulli suurtähed. Kui kasutate mitte-ahne quantifiers, olge sobitamine liiga vähe, mis on sümmeetriline oht.

Muster-match töötlejad

/M.*[ise] /

MAINE # Massachusetts # Colorado #
mississippi # Missouri # Minnesota #

/M.*[ise] /i

MAINE # Massachusetts # Colorado #
mississippi # Missouri # Minnesota #

/M.*[ise] /gis

MAINE # Massachusetts # Colorado #
mississippi # Missouri # Minnesota #
Me juba nägime ühte mustrit-vaste teisendaja muutmise näited: global töötleja. Tegelikult, paljud regulaaravaldis, tööriistad, me oleks pidanud kasutades “g” modifier) kõik meie muster sobib. Ilma “g”, paljud tööriistad sobib ainult esimene esinemine muster liini eesmärk. Nii et see on kasulik töötleja (kuid mitte üks sa tingimata tahad kasutada alati). Vaatame mõned teised.

Nagu väike mnemoonika, see on tore meeles pidada, et sõna “gismo” (see isegi tundub kuidagi asjakohane). Kõige sagedamini töötlejad on:

  • g – Match ülemaailmselt
  • i – tõstutundlik vaste
  • s – Treat string, sest üks rida
  • m – Treat string nii mitmes reas
  • o – Ainult kompileerida muster kord

o variant on rakendada optimeerimine, ja tegelikult ei regulaaravaldis küsimus (aga see aitab mnemoonika). single-line valik võimaldab lühend sobitada reavahetuse märk (see ei ole teisiti). multiple-line valik põhjustab ” ^ “” ja “” $ ” mängu algus-ja lõpp-iga joon eesmärk ja mitte ainult algus/lõpp-eesmärgi tervikuna (koos sed või grep see on vaikimisi). insensitive valik ignoreerib erinevuste korral tähti.

Muutmine backreference käitumine

s/([A-Z])(?:-[a-z]{3}-)([0-9]*)/\1\2/g

< A-xyz-37 # B:abcd:142 # C-wxy-66 # D-qrs-93
> A37 # B:abcd:42 # C66 # D93
Backreferencing asendamine patterns on väga võimas, aga see on ka lihtne kasutada rohkem kui üheksa rühmade keerulise regulaaravaldis. Lisaks, kasutades olemasolevaid backreference nimed, see on sageli rohkem loetav viidata osade asendamine muster järjekorras. Käsitleda seda küsimust, mõned regulaaravaldis vahendid võimaldavad “rühmitamine ilma backreferencing.”

Grupp, et ei tohiks olla ka käsitleda tagasi viide on küsimus-mark koolon alguses grupi, nagu “(?:muster).” Tegelikult, te võite seda süntaksit kasutada isegi siis, kui teie backreferences on otsida ise.

Nimetamine backreferences

import re
txt = "A-xyz-37 # B:abcd:142 # C-wxy-66 # D-qrs-93"
print re.sub("(?P<prefix>[A-Z])(-[a-z]{3}-)(?P<id>[0-9]*)",
             "\g<prefix>\g<id>", txt) 

A37 # B:abcd:42 # C66 # D93
Python keele pakub eriti mugav süntaksit tõesti keeruline muster backreferences. Selle asemel, et lihtsalt mängida numbrite tasakaalustatud rühmade, saate anda neile nimi.

Süntaks, kasutades regulaaravaldisi aastal Python on standard, programmeerimise keel funktsioon/meetod stiilis kõne, mitte Perl – või sed-style slash piirajad. Kontrollige oma tool, et näha, kas ta toetab seda võimalust.

Vaata edasi väited

s/([A-Z]-)(?=[a-z]{3})([a-z0-9]* )/\2\1/g

< A-xyz37 # B-ab6142 # C-Wxy66 # D-qrs93
> xyz37A- # B-ab6142 # C-Wxy66 # qrs93D-

s/([A-Z]-)(?![a-z]{3})([a-z0-9]* )/\2\1/g

< A-xyz37 # B-ab6142 # C-Wxy66 # D-qrs93
> A-xyz37 # ab6142B- # Wxy66C- # D-qrs93
Teine trikk arenenud regulaaravaldis vahendid on “lookahead väiteid.” Need on sarnane korrapärase rühmitatud subexpression, välja arvatud juhul, kui nad tegelikult ei haara, mida nad vastavad. Seal on kaks eeliseid kasutades lookahead väiteid. Ühelt poolt, lookahead väide, mille kohaselt võivad toimida sarnaselt a-rühma, mis ei ole backreferenced; see tähendab, et sa ei sobi midagi, arvestamata seda backreferences. Veelgi olulisem on aga, lookahead väide võib määrata, et järgmise tüki muster on teatud vormis, vaid lased erinevatel subexpression tegelikult haara see (tavaliselt eesmärgil backreferencing, et teised subexpression).

On kahte tüüpi lookahead väited: positiivne ja negatiivne. Kui te ootaks, positiivse väite täpsustatakse, et midagi ei astu edasi ja negatiivne täpsustatakse, et midagi ei astu edasi. Rõhutades oma seost mitte-backreferenced rühmad, süntaksit lookahead väited on sarnased: (?=muster) on positiivseid väiteid ja (?!muster) negatiivseid väiteid.

Tehes regulaarselt väljendeid loetavamaks

/               # identify URLs within a text file
          [^="] # do not match URLs in IMG tags like:
                # <img src="https://mysite.com/mypic.png">
http|ftp|gopher # make sure we find a resource type
          :\/\/ # ...needs to be followed by colon-slash-slash
      [^ \n\r]+ # stuff other than space, newline, tab is in URL
    (?=[\s\.,]) # assert: followed by whitespace/period/comma
/

The URL for my site is: http://mysite.com/mydoc.html.  You
might also enjoy ftp://yoursite.com/index.html for a good
place to download files.
hiljem näited me oleme hakanud vaata, kuidas keerukaid regulaaravaldisi saad. Need näited ei ole poole. Seda on võimalik teha mõned peaaegu absurdselt raske mõista asju regulaaravaldis (kuid need, mis on siiski kasulik).

Seal on kaks põhilisi vahendeid, et mõned rohkem arenenud regulaaravaldis tööriistade kasutamist selgitada väljendeid. Üks on see, mis võimaldab regulaaravaldisi jätkata üle mitme read (ignoreerides tühimärkide nagu trailing tühikuid ja reavahetusi). Teine on see, mis võimaldab kommentaarid jooksul regulaaravaldisi. Mõned vahendid võimaldavad teil teha ühe või teise need asjad üksi, aga kui see saab keeruline teha mõlemad!

Esitatud näites kasutab Perl ‘ expigem modifier) võimaldab kommenteeris multi-line regulaaravaldisi. Konsulteerida dokumentatsiooni jaoks oma tööriist andmed selle kohta, kuidas kirjutada neid.

Leave a Reply

Your email address will not be published. Required fields are marked *