Reguliere expressies
|
|
|
- Sandra Kuipersё
- 8 jaren geleden
- Aantal bezoeken:
Transcriptie
1 Reguliere expressies 1. Introductie Reguliere expressies vormen een specificatie-taal die een rol speelt als je in een grote hoeveelheid tekst een bepaald stukje zoekt. Het zoekwerk laat je door je computer doen, maar die wil een nauwkeurige specificatie van wát hij precies moet zoeken. Daarvoor gebruik je een notatie in reguliere expressietaal. Omderest van dit artikel wateenvoudiger te maken zullen we 'reguliere expressie' vaak afkorten tot regex. Reguliere expressies behoren tot de meest krachtige mechanismen die binnen UNIX worden gebruikt. Reguliere expressies worden overal gebruikt waar in tekstbestanden wordt gezocht. Bijvoorbeeld: alle editors kennen een search-replace operatie. Het search-gedeelte van zo n operatie noteer je altijd als reguliere expressie. Om reguliere expressies hier te demonstreren maken we gebruik van een tekstbestand met de naam woordjes,dat het volgende lijstje woorden bevat: appel aardappel pennen aardnoten piet. lopen apenoot pellen. pinda mat maria pint dit is een volledig lege regel Behalve een tekstbestand om in te zoeken hebben we ook een zoek-commando nodig als demonstratie-vehikel. UNIX heeft veel mogelijkheden, en wij kiezen het commando grep. De gebruiker geeft aan grep bij het starten een zoekstring (in regex-notatie) plus de namen van een of meer tekstbestanden. Het commando zoekt Copyright AT Computing 2010,2012,2017 Versie: 6a
2 Reguliere expressies 2 dan in die bestanden naar de regels waarin een stukje tekst voorkomt dat past op onze regex. Die regels worden dan getoond als output. In regex-jargon wordt dat passen op een match genoemd: grep toont alle tekstregels waarbinnen een stukje tekst voorkomt dat matcht op de gegeven regex. Je moet op dit punt goed onderscheid maken tussen enerzijds de reguliere expressies als specificatietaal, en anderzijds het specifieke gedrag van een bepaald commando dat we als demonstratie-vehikel gebruiken. Het 'toon de omhullende tekstregel' is specifiek voor wat het commando grep doet nadat het zoeken geslaagd is. Als we als demonstratie-vehikel een editor hadden gebruikt met een search/replace opdracht dan was het gevonden stukje tekst vervangen door een ander. Maar dit artikel gaat over het zoeken zelf: hoe specificeer je wat je wilt (laten) zoeken, en hoe gaat dat zoeken precies in zijn werk. Alle commando s die regex-notatie ondersteunen, en die we dus als demonstratie-vehikel kunnen gebruiken, hebben dat stuk zoek-notatie en zoek-functionaliteit gemeenschappelijk. 2. Drie generaties regex De UNIX reguliere expressies zijn ontworpen in de eerste helft van de jaren 70. Daarna heeft de tijd niet stilgestaan, en zijn nieuwe ideeën toegevoegd. Tegenwoordig kun je drie generaties van reguliere expressies tegenkomen: BRE s: de Basic Regular Expressions. commando swordt gehanteerd. Dit is de basisvorm die in de meeste ERE s: de Extended Regular Expressions. Zehebben meer mogelijkheden dan de BRE s, maar zijn niet helemaal upward compatible. Dus je moet bij een commando wel weten of dat BRE s of ERE s ondersteunt. Veel commando s doen als default BRE s, maar met een vlaggetje kun je ze naar ERE-support schakelen. De Posix-standaard heeft precieze specificaties vastgelegd voor zowel BRE s als ERE s. Maar als je ergens de term 'Posix'-regular expressions tegenkomt dan bedoelt men meestal de ERE s. De ontwerper van de programmeertaal Perl heeft ook veel nieuwe ideeën op regular-expressie gebied ingebracht. De Perl Regular Expressions vormen dus de jongste van de drie generaties. Ook voor deze generatie geldt dat áls een commando m ondersteunt, daar meestal een apart vlaggetje voor moet worden meegegeven. In dit artikel beginnen we met de Basic Regular Expressions. 3. Basisvor m De eenvoudigste reguliere expressies zijn letterlijke teksten: als je een eenvoudig stukje tekst zoekt dan schrijf je dat recht-toe-recht-aan op. Als we zoeken naar a dan vindt grep alle regels met een letter a erin:
3 Reguliere expressies 3 $ grep a woordjes appel aardappel aardnoten apenoot pinda mat maria Als je zoekt naar aa dan vindt grep alle regels waarin aa voorkomt: $ grep aa woordjes aardappel aardnoten Een regex zoals appel levert alle regels op waarin appel voorkomt; dit kan ook onderdeel van een groter woord zijn (hier aardappel). Dus strikt genomen zoekt grep niet naar appel als woord, maar naar appel als string. Vrijwel alle tekens waarmee je een reguliere expressie opschrijft worden gezien als letterlijke letters. Maar een paar (lees-)tekens hebben een bijzondere betekenis. We kunnen daarmee extra eisen stellen. 3.1 Veranker ing in reguliere expressies Bijvoorbeeld kunnen we grep laten zoeken naar regels die met een a beginnen. Hiervoor laten we onze reguliere expressie beginnen met het speciale symbool ˆ De reguliere expressie ˆa wordt vertaald in: zoek naar een a die aan het begin van een regel staat. Dus: $ grep ˆa woordjes appel aardappel aardnoten apenoot Op dezelfde manier betekent een $ aan het einde van een regex dat het gezochte aan het einde van de regel moet matchen. Daar mag dan zelfs geen spatie meer achter staan. Dus we schrijven als regex a$ om de regels te vinden die op een a eindigen: $ grep a$ woordjes pinda maria
4 Reguliere expressies 4 Als aa twee op elkaar volgende letters a zoekt, dan moet ˆ$ een lege regel vinden. Immers op een lege regel volgt het einde meteen op het begin. En inderdaad: $ grep ˆ$ woordjes deze output is de lege regel uit ons woordjes-bestand Het vasthaken van een reguliere expressie aan het begin en/of het einde van de regel heet verankering. In Engels jargon heten deze ˆ en $ anchors. Het is belangrijk om je te realiseren dat anchors een positie aanduiden: de positie vóór het eerste teken op de regel, resp. de positie achter het laatste teken. De anchors zelf hebben dus een breedte van nul tekens. ˆ voorop in een regex betekent dat het te zoeken patroon aan het begin van een regel moet staan. $ achteraan een regex betekent dat het te zoeken patroon aan het eind van een regel moet staan. Tekstbestanden die zijn gemaakt voor Microsoft Windows geven problemen met het $ anchor. Onder de motorkap zitten die bestanden anders in elkaar dan UNIX/Linux tekstbestanden. Het verschil zit in de manier waarop een regel-einde is gecodeerd. Een UNIX-bestand heeft als regeleinde een ASCII-linefeed code, en een Windows bestand heeft een ASCII-carriage return code, met daarachter een ASCII-linefeed. Als je zoekt naar tekst$ dan zit bij een Windows-bestand die carriage return in de weg. Er zijn veel tools beschikbaar om tekstbestanden te converteren, maar zonder conversie vind je nooit een matchopzo n $ anchor. 3.2 Meerderetekens als alterna tief op één positie Kunnen we grep nu ook vragen om alle plaatsen waar òf een a òf een l voorkomt? Dat kan door gebruik te maken van een constructie die een keuze uit verschillende tekens mogelijk maakt. Als we schrijven [al] dan zoeken we daarmee één teken, maar dat teken mag zowel een a als een l zijn. Dus tussen de blokhaken sommen we alle voor ons acceptabele letters op. Zoeken naar een a òf een l gaat als volgt: $ grep [al] woordjes appel aardappel aardnoten lopen apenoot pellen. pinda mat maria We zien dat sommige outputregels zowel een a als een l bevatten, maar iedere gevonden regel bevat minstens één van de twee letters. Als we laten zoeken naar [aeo][aou] dan zoeken we naar twee opeenvolgende
5 Reguliere expressies 5 letterposities (want elk setje blokhaken telt voor één positie), waarbij we op de eerste positie een a of e of o accepteren, en op de tweede positie een a of o of u. Merk dus op dat een regex-specificatie positie voor positie aan elkaar schakelt wat we precies willen zoeken. grep vindt alle regels eindigend op een a óf een l met: $ grep [al]$ woordjes appel aardappel pinda maria 3.3 De complementaire verzameling We gaan het nog algemener maken: we willen bijvoorbeeld zoeken naar alle regels die niet op een a eindigen. Dan zouden we tussen blokhaken een uitputtende lijst van alle mogelijke tekens moeten maken die geen a zijn. Dat is veel werk. Het is ook lastig om zeker te weten of we alle mogelijke tekens hebben opgeschreven. Dus er is een notatie nodig met de betekenis: niet-a. Demanier om dat op te geven is [ˆa] Iets nauwkeuriger: een willekeurig teken dat alleen niet de waarde van de tekens tussen de blokhaken mag hebben (hier dus niet een a). Let op: het dakje kan in reguliere expressies dus twee verschillende dingen betekenen: aan het begin van een regex is het het regelbegin-anker symbool, en vlak na een blokhaak-openen geeft het aan dat de rest tussen die blokhaken betekent: niet dezen. Dus alle regels die niet eindigen op een a vind je via: $ grep [ˆa]$ woordjes appel aardappel pennen aardnoten piet. lopen apenoot pellen. mat pint Merk op: de lege regel vinden we niet, want op die regel staat geen enkele letter, dus zelfs geen niet-a.
6 Reguliere expressies 6 Nog een voorbeeld: alle regels die met een niet-a beginnen zijn: $ grep ˆ[ˆa] woordjes pennen piet. lopen pellen. pinda mat maria pint Het eerste ˆ is beginanker: dat matcht het begin van de regel. Het tweede ˆ keert de betekenis van de blokhaken-verzameling om. We moeten wel opletten, want grep [ˆa] doet niet het omgekeerde van grep a. Kijk maar: $ grep [ˆa] woordjes appel aardappel pennen aardnoten piet. lopen apenoot pellen. pinda mat maria pint Iedere regel bevat immers wel ergens een niet-a,behalve die lege regel natuurlijk. 3.4 Eén willekeur ig teken We kunnen ook aangeven dat op een positie een willekeurig teken mag staan. Dat is dus ruimer dan een expliciete verzameling opgesomd tussen blokhaken. Bijvoorbeeld: zoek naar een rijtje van vier letters waarvan de eerste en de laatste een a moeten zijn. Op de twee plekken daartussenin accepteren we elk willekeurig teken. In reguliere expressies schrijven we dat als a..a waarbij de punt (.) de notatie voor hier één willekeurig teken is. Bij ons voorbeeldbestand vinden we dan met grep: $ grep a..a woordjes aardappel hier matcht arda maria hier matcht aria 3.5 Speciale tekens degraderen En hoe moeten we de regels zoeken die eindigen op een punt? Niet met.$ want dat toont alle niet-lege regels (regels met één willekeurig teken vlak voor het einde).
7 Reguliere expressies 7 Hiervoor is een systematische oplossing: een teken dat een bijzondere betekenis heeft binnen de reguliere expressie-notatie kunnen we die bijzondere betekenis afpakken door er een backslash \ voor te zetten. Daarmee degraderen we dat speciale teken tot: hier bedoelen we m als letterlijk dát teken. Merk op dat door deze aanpak de backslash zelf ook een speciaal teken in de regex-taal is geworden. Dus zoeken van één letterlijke backslash moet zo: \\ De regels die eindigen op een (letterlijke) punt vinden we zo: $ grep \.$ woordjes piet. pellen. Merk op dat dit gebruik van backslash om een symbool te ontdoen van zijn speciale betekenis ook in de shell-taal voorkomt. De shell-taal kent, naast backslash, ook quotes als alternatieve notatie voor ditzelfde 'degradatie'-doel. De regex-taal kent quotes voor dit doel niet. 3.6 Eén teken in reguliere expressies Er zijn dus vier methoden om een teken in een reguliere expressie aan te geven. In volgorde van meest tot minst nauwkeurig gespecificeerd, zijn dit: a een teken dat letterlijk zo moet voorkomen (hier dus een a). \. ook een letterlijk teken, met name als dat teken binnen reguliere expressies iets bijzonders betekent (hier in dit voorbeeld een letterlijke punt). [abc] het gezochte teken moet er één uit het opgesomde rijtje zijn (hier dus een a of een b of een c) [ˆ0123] we zoeken op deze plek één willekeurig teken, zo lang het maar niet eentje uit het opgesomde rijtje is. In dit voorbeeld mag het dus geen 0, 1, 2 of 3 zijn.. een willekeurig teken Een teken dat soms verwarring kan scheppen is de TAB (in de ASCII-tabel het teken met waarde 9). De TAB telt ook in reguliere expressies als één enkel teken. De TAB zorgt echter voor het schuiven van de cursor naar de volgende tabulator-stop. Op het scherm kun je daarom (afhankelijk van de positie waar de TAB op het scherm terecht komt ) meerdere spatie-stappen zien.
8 Reguliere expressies 8 Reeksen tekens tussen blokhaken mag je afkorten met een liggend streepje: bijvoorbeeld [a z] betekent: elke kleine letter uit het alfabet. Hier moet een waarschuwing bij: de onderlinge volgorde van tekens ligt vast in de z.g. ASCII-characterset standaard. Daarin zijn de kleine letters onderling opeenvolgend, evenals de hoofdletters ende cijfers. Maar gebruik nooit iets als [a Z]; dat zal fout gaan omdat je daarbij aanneemt dat de hoofdletters op de kleine volgen terwijl in de ASCII-standaard die volgorde andersom is. Gebruik in plaats daarvan [a za Z] Dus het liggend streepje koppelt de letter die je vlak ervoor schrijft aan de letter die je vlak erachter schrijft. Wil je een letterlijk liggend streepje zoeken dan kun je m als laatste vlak voor de sluit-blokhaak zetten. Letters met accenten komen in de ASCII-characterset helemaal niet voor. Daarover volgt later in dit verhaal meer informatie. 3.7 De Kleene-ster Stel nu dat we zoeken naar woorden waar een combinatie van de letters n, o en t voorkomt in die volgorde achter elkaar. En het aantal letters o maakt ons hierbij niet uit. We willen dus zoeken naar not,naar noot,naar nooot enzovoorts. Zo n herhaling kunnen we aangeven door achter een teken een quantifier te plaatsen, waarmee we iets zeggen over hoe vaak dat teken achter elkaar mag voorkomen. De meest gebruikte quantifier is het sterretje 2. Als we achter een teken een sterretje plaatsen, accepteren we dat teken nul of meer keren achter elkaar. We zoeken dus: $ grep no*t woordjes aardnoten apenoot pint De regel pint doet mee want hij bevat een n en een t, endaartussen nul keren een o. Als we specifiek dat nul-geval niet willen, moeten we schrijven: $ grep noo*t woordjes aardnoten apenoot dat wil zeggen, minstens één o en eventueel meer. Deeerste o staat op eigen benen, en de o daarachter hoort bij de * Anders gezegd: we willen in ieder geval één o, en optioneel accepteren we daarachter nog meerdere o s. Dat laatste toont de werkelijke kracht van de *: hij zegt dat een bepaalde component optioneel is. Met de * bouw je optionele delen in je regex. 2. Dit sterretje is genoemd naar de wiskundige Steve Kleene, die de theoretische grondslag voor de reguliere expressies heeft bedacht: Cole Kleene
9 Reguliere expressies 9 Bijvoorbeeld: toen we eerder de $ behandelden als einde-regel anker, schreven we daarbij als waarschuwing: de voorafgaande expressie moet aan het einde van een regel matchen. Daar mag dan zelfs geen spatie meer achter staan. Maar stel dat we dit willen afzwakken en eventueel spaties achteraan de regel toch mee willen accepteren. Dan laten we onze reguliere expressie eindigen op *$ (spatie ster dollar) om uit te drukken dat vlak voor het einde van de regel optioneel nog spaties mogen staan. De * werkt op het voorafgaande element; dat mag een specificatie in [...]-vorm zijn. Dus: $ grep [aeio][aeio][aeio]* woordjes aardappel aardnoten piet. apenoot maria vraagt om 'twee of meer' voorkomens van a,e,i,o: twee stuks [aeio] staan op eigen benen, en optioneel nog (nul of) meerdere [aeio] daarachter. Het sterretje hoort dus uitsluitend bij de laatste van de drie [aeio] stukken, want dat is het optionele stuk. De eerste twee [aeio] stukken gaan over wat verplicht aanwezig moet zijn. Let ook op de juiste interpretatie. Het betekent niet: 'twee of meer a' of'twee of meer e' enz, maar 'twee of meer elementen die elk voor zich matchen op [aeio]'. Dus elke mix van a s, e s, i s en o s isgeldig,als die maar minstens twee lang is. * na een teken (of een veldje) betekent dat dat teken nul of meer keren herhaald op die plek mag voorkomen. Stel nu opnieuw dat we alle regels willen hebben waarin geen a voorkomt. De eis is dan dat het eerste tot en met het laatste teken een niet-a is. Dus: $ grep ˆ[ˆa]*$ woordjes pennen piet. lopen pellen. pint Door de verankering, het ˆ vooraan en de $ aan het eind van de expressie, voorkomen we de problemen die we eerder hadden met grep [ˆa]. We moeten nu zeker niet het sterretje vergeten, want zonder sterretje zoeken we een regel met precies één teken erop, dat ook nog eens een niet-a moet zijn. Merk op dat we ook de lege regel vinden, omdat het sterretje ook nul keer een niet-a toestaat.
10 Reguliere expressies 10 Op dezelfde wijze kunnen we zoeken naar alle regels die alleen maar de letters g tot en met t bevatten: $ grep ˆ[g t]*$ woordjes pint de lege regel wordt ook gevonden Als we de lege regel niet erbij willen hebben, wordt het: $ grep ˆ[g t][g t]*$ woordjes pint Zoeken we nu naar regels die met een a beginnen en op een t eindigen. Tussen de a en de t mogen willekeurige tekens staan (en ook willekeurig veel). We proberen eerst dit: $ grep a.*t woordjes aardnoten apenoot mat We vinden meer dan de bedoeling is, want we zijn de verankering vergeten. We vinden bijvoorbeeld mat omdat onze regex niet eist dat de regel met een a moet beginnen. Beter is: $ grep ˆa.*t$ woordjes apenoot Hoe vinden we nu de regels die twee maal een e bevatten? Als volgt: $ grep e.*e woordjes pennen pellen. Zoekt dit alle regels die exact twee maal een e bevatten? Nee, herhaal de opdracht maar eens met een letter a: $ grep a.*a woordjes aardappel hier zitten drie a s in aardnoten maria
11 Reguliere expressies 11 Als we exact twee keer een a eisen, moeten we ook uitsluiten dat tussen de rest van de tekens in die regel nog n extra letter a zit. Om alle tekens van de regel mee te nemen in onze specificatie,gebruiken we verankering: $ grep ˆ[ˆa]*a[ˆa]*a[ˆa]*$ woordjes aardnoten maria In woorden uitgedrukt kun je bovenstaande lezen als: vanaf het begin van de regel eerst nul of meer niet-a s (dat is het stukje [ˆa]* ). Daarachter volgt de eerste a, dan volgt weer nul of meer niet-a s, dan weer (wel een) a, endaarna tot aan het einde van de regel nog nul of meer niet-a s. Of, nog anders gezegd: vanwege de twee ankers overdekt deze specificatie de gehele regel, en je ziet in de regex de beide (wel-)a s staan. Daarvoor, daartussen en daarachter mogen alleen niet-a s staan. Op een schematische manier getekend: ˆ a a $ [ˆa]* [ˆa]* [ˆa]* Constructies in deze trant komen veel voor, dus het is de moeite waard om dit voorbeeld goed te bestuderen. 3.8 Nog meer herhalingen De Kleene-ster die volgt op een regex zegt: van die regex accepteer ik nul of meer herhalingen. Er bestaat een notatie om andere aantallen te kiezen in plaats van nul of meer,hoewel die in de praktijk weinig wordt gebruikt. Dit is de notatie: regex\{m,n\} Achter de regex geven we met backslashes en accolades de gewenste aantallen op. De m en n zijn gehele getallen 0 en geven de gewenste van-tot/met range aan. Er zijn twee variaties mogelijk: regex\{m,\} m stuks en meer (minstens m) regex\{m\} precies m stuks Dus regex* is hetzelfde als regex\{0,\} Het gebruik van de backslash is hier strijdig met de normale betekenis: hier maakt een backslash de accolade juist speciaal in plaats van dat hij m degradeert. 3.9 Groeperen met haakjes We hebben gezien dat herhalingen steeds van toepassing zijn op het direct voorgaande teken. Om ook in staat te zijn een groep van meerdere tekens aan te geven voor herhaling, kun je tekens groeperen door ze tussen haakjes te zetten. De haakjes moeten bij BRE s wel vooraf gegaan worden door een backslash. Dus: \(dat\)*
12 Reguliere expressies 12 zoekt naar nul of meer voorkomens van de string dat. Verderop zullen we zien dat groeperen met haakjes nog een bijeffect heeft. Ook hier is, net als in de vorige paragraaf, het gebruik van de backslashes weer strijdig met de normale betekenis: ze maken de haakjes speciaal, dus promoveren in plaats van degraderen. De reden is dat deze speciale notaties niet vanaf het allereerste begin in de reguliere expressies hebben gezeten, dus haakjes en accolades waren oorspronkelijk gewone characters. Omcompatibel te blijven moest daarom een promoveren notatie worden bedacht. In de Extended Reguliere Expressies (ERE s), die we later in dit verhaal bespreken, is dit rechtgetrokken: haakjes en accolades zijn daar speciaal, en met een backslash kun je ze degraderen Character classes Eerder zagen we dat je tussen blokhaken een streepje (hyphen) tussen twee characters kunt zetten om een range aan te geven, bijvoorbeeld [0 9] of [a za Z] Maar dit is een range volgens de ASCII-standaard, en daar zit slechts een beperkt aantal characters in. Letters met accenten (officiële term: met diacritische tekens) ontbreken, evenals allerlei nationale uitbreidingen zoals de ß, de ð of de Daarom zijn er verzamelnamen gemaakt, waarmee je in één klap een hele verzameling van tekens kunt aanduiden, inclusief alle non-ascii variaties die er bestaan: reguliere expressie [:alpha:] [:lower:] [:upper:] [:digit:] [:xdigit:] [:alnum:] [:punct:] [:graph:] [:print:] [:cntrl:] [:blank:] [:space:] betekenis een letter een lower case letter een upper case letter een decimaal cijfer een hexadecimaal cijfer een letter of cijfer alle leestekens een zichtbaar,printable char (geen spatie/tab) alles behalve control characters een control character een spatie of een tab spatie,tab,form feed, vertical tab,newline,carriage return Deze verzamelnamen mag je alleen gebruiken tussen de regex-blokhaken. Omdat bij de namen zelf ook blokhaken horen moet je zorgen om niet in die haken verstrikt te raken. Bijvoorbeeld: [[:alpha:]2 5] staat voor een positie waarop een letter staat óf een van de cijfers 2 t/m 5. Het is belangrijk om te beseffen dat we hiermee méér dan de ASCII-verzameling aankunnen, maar dat we nog steeds binnen het Latijnse alfabet blijven. Uitbreiden naar andere alfabetten, of zelfs naar alfabet-loze talen (Chinees, Japans, Koreaans) is een specialisme apart.
13 Reguliere expressies Het huishoudelijk reglement Als de expressies ingewikkelder worden krijg je misschien verschillen in interpretatie van hun betekenis. Er is een soort huishoudelijk reglement om moeilijke knopen door te hakken en zo de eenheid te bewaren: Een regex matcht alleen maar binnen één regel. Je zult dus nooit een match krijgen die bestaat uit de staart van een regel, en dan doorlopend in de kop van de volgende regel. Anders gezegd: als in de data een nieuwe regel begint, dan krijgt het zoeken van een matcheen soort reset. Binnen een regel wordt de eerste matchende plek genomen: Deze first match bepaling is alleen maar van toepassing in editor search/replace situaties. Ze heeft dus eigenlijk betrekking op het replacen en niet op het zoeken. In de editor-commandotaal zit meestal wel een mogelijkheid om deze first match beperking te omzeilen. Quantifiers zijn greedy (gulzig). Ze pakken altijd het langst passende stuk. Als je bijvoorbeeld zoekt naar e*l in de tekstregel veel ervaring dan kun je, als advocaat van de duivel, zeggen dat niet alleen het stukje eel matcht, maar op diezelfde plek matcht ook el en zelfs de l alleen. In dit soort discussies wordt de knoop doorgehakt door deze longest match bepaling: het wordt de langste die past. Deze bepaling is ondergeschikt aan de vorige (maar die vorige is dus niet altijd van toepassing). Als aan het begin van een regel een korte match zit, maar verderop in die regel is een andere, veel langere match tehalen, dan telt tochdegene het meest vooraan in de regel. Matching is hoofdlettergevoelig (case sensitive). Doorgaans is er wel een mogelijkheid om het matchen case insensitive te laten uitvoeren. Maar dat zit dan in de argumenten van het gebruikte commando of de gebruikte programmeertaal; niet in het regex-gedeelte Back-referencing Eerder is genoemd dat het groeperen van tekens tussen haakjes een bijeffect heeft. Wat tussen de haakjes staat wordt niet alleen gegroepeerd, maar ook onthouden. We kunnen verderop in de regex naar deze onthouden tekens refereren. Deze techniek heet back-referencing.
14 Reguliere expressies 14 Laten we een voorbeeld nemen. Hierboven keken we naar alle regels waarop aa voorkwam. Stel nu dat we alle regels willen hebben waarop een teken twee keer direct na elkaar voorkomt. Dat doen we als volgt: $ grep \(.\)\1 woordjes appel matchophet gedeelte pp aardappel matchophet gedeelte aa en op pp pennen matchophet gedeelte nn aardnoten matchophet gedeelte aa apenoot matchophet gedeelte oo pellen. matchophet gedeelte ll In dit voorbeeld zoeken we een willekeurig teken dat door hetzelfde teken gevolgd moet worden: \1 refereert aan wat er tussen de haakjes staat (je kunt naar maximaal 9 groepen terugverwijzen op die manier). Dus zoeken naar setjes van vier tekens met het eerste en vierde gelijk aan elkaar: $ grep \(.\)..\1 woordjes aardappel matchophet gedeelte arda pennen matchophet gedeelte enne en op nnen pellen. matchophet gedeelte elle maria matchophet gedeelte aria \(regex\) definieert een groep tekens, waarvan de inhoud de match van de reguliere expressie regex is. De haken zelf hebben geen invloed op wat er precies wordt gematcht. Anders gezegd: een regex mèt of zonder dit soort haken matcht precies dezelfde tekst. De haken dienen om het volgende punt te ondersteunen. \n (n is een cijfer 1-9) matcht hetzelfde als waar het veldje dat begint bij het n-de haakje-openen op past. Als we meerdere groepen gebruiken, komt de nummering van de groepen overeen met het haakje openen van de groepen. Bijvoorbeeld bij deze geneste haakjes: $ grep \(.\(.\)\)\2\1 woordjes pennen matchophet gedeelte ennen We vinden hier dus alle regels waarop een rijtje van vijf tekens voorkomt, waarbij de eerste twee tekens hetzelfde zijn als de laatste twee en ook het tweede en derde teken gelijk zijn. Merk op dat dit niet hetzelfde is als: ik bedoel dezelfde reguliere expressie als ik tussen de haken had opgeschreven. Het gaat niet om een herhaling van de expressie zelf, maar om een herhaling van wat die expressie had gevonden. Dit voorbeeld laat meteen ook zien dat 'nesting' van dit soort haakjes is toegestaan. In veel editors zien we dat bij een search-replace operatie deze back-reference notatie \n ook nog gebruikt mag worden in het replace-gedeelte van het commando.
15 Reguliere expressies ERE s: de Extended Regular Expressions Enkele jaren na de komst van de 'gewone' Basic Regular Expressions in UNIX zijn, als verbetering en uitbreiding, de Extended Regular Expressions gekomen. Ze zijn niet helemaal compatibel met de Basic RE s. Daarom is geen enkel commando 'stilzwijgend' uitgebreid naar deze nieuwe mogelijkheden: je moet ófwel een speciaal vlaggetje geven (zoals de E vlag bij grep, ofde r vlag bij de GNU-versie van sed), ófwel je moet gewoon weten dat een bepaald commando alleen ERE s doet (zoals awk). Terugkijkend op wat we in dit artikel al over de BRE s hebben gezegd zijn de belangrijkste veranderingen: Ronde haakjes worden niet langer door een backslash voorafgegaan. Ook bij { en } herhalingsfactor (quantifier) is de backslash als aanduider van de speciale betekenis voor de accolades vervallen. Accolades zijn nu altijd speciaal. Er moet een backslash voorgezet worden om ze te degraderen tot 'ik zoek een letterlijke accolade'. De accolades zelf hebben wel hun oude betekenis gehouden van herhalingsfactor. De Kleene ster * heeft + en? als broertjes erbij gekregen. De belangrijkste uitbreiding is dat meerdere RE s via een Booleaanse or met elkaar kunnen worden verbonden. Een bekende implementatie van ERE s is de regex-library van Henri Spencer. Die is niet helemaal compatible met de Posix-standaard voor ERE s, maar wel grotendeels. Deze library wordt o.a. gebruikt in MySQL. MariaDB, de opvolger van MySQL, gebruikt Perl-compatible regex en. 4.1 Groeperen in ERE s Met de ronde haken kun je ook 'meertraps' patronen bouwen: ([a z]+[0 9]+ )+ Tussen de haken staat hier dat je een of meer letters zoekt, gevolgd door een of meer cijfers, gevolgd door een spatie, maar met de + buiten de haken zeg je dat je van die combinatie weer een of meer herhalingen accepteert. Merk op dat we bij de haken geen backslashes meer gebruiken! en? quantifier s in ERE s De Kleene-ster * in zijn betekenis van nul of meer herhalingen van de voorafgaande bouwsteen is gebleven. Maar daarnaast is de + gekomen met betekenis: één of meer herhalingen van de voorafgaande bouwsteen. We hebben eerder als voorbeeld behandeld: $ grep ˆ[g t][g t]*$ woordjes
16 Reguliere expressies 16 en dat kan nu eenvoudiger als: $ grep E ˆ[g t]+$ woordjes flag E schakelt grep naar ERE s Verder is de? erbij gekomen in de betekenis van nul of één herhaling. Een consequentie hiervan is dat dus ook de + en? speciale tekens zijn geworden. Wiljezeergens letterlijk zoeken dan moet er een \ voor. Merk op dat de notatie regex{1,} en regex{0,1} hetzelfde betekent als deze + en? In de Basic Regular Expressions is deze specificatie met accolades ook beschikbaar,maar daar moet vóór elke accolade een backslash erbij worden gezet. 4.3 Tweeregex en met Booleaanse OR (alterna tion) De belangrijkste uitbreiding in de ERE s is de mogelijkheid om twee reguliere expressies met een Booleaanse or aan elkaar te schakelen. eenregex andereregex zoekt op die plaats naar een stuk tekst dat óf op de eenregex matcht, óf op de andereregex.een beetje ingewikkelder is: eersteregex(tweederegex derderegex)vierderegex zoekt naar tekst waarvan het beginstuk matcht op de eersteregex, daaraan vast moet een stuk zitten dat ófwel matcht op de tweederegex ófwel op de derderegex, en daarachter moet een stuk zitten dat matcht op de vierderegex. Merk op dat je in dit voorbeeld de twee alternatieven moet groeperen (met ronde haken) om ze te kunnen onderscheiden van de rest van de regex. 5. Filenaam wildcards ver sus reguliereexpressies Filenaam-wildcard notatie en reguliere expressie notatie worden vaak door elkaar gehaald. Maar het zijn twee heel verschillende notatie-systemen! Bijv.opshell-niveau filenamen zoeken die met een letter a beginnen gaat zo: $ ls a* maar als je die via reguliere expressies wilt zoeken dan gaat het zo: $ ls grep ˆa Filenaam wildcard expansie wordt door de shell gedaan, nadat je een commandregel hebt afgesloten met enter, en voordat het gevraagde commando van start gaat. In UNIX-jargon heet die expansie ook wel globbing. De shell doet niet aan reguliere expressies, en'gewone' commando s doen niet aan filenaam-expansie (globbing) op enkele uitzonderingen na, zoals find, tar en locate 3.
17 Reguliere expressies 17 Filenaam wildcard notatie gaat met de volgende speciale characters: * een reeks van nul of meer characters? exact één character [...] één character uit de verzameling tussen de haken De [...] notatie is toevallig een component die zowel in de reguliere expressies als in de filenaam wildcards voorkomt, met identieke betekenis. Maar variaties met die blokhaken gaan al meteen verschillend. Als je een character, juist niet uit de verzameling wilt hebben dan is dat [ˆ...] bij reguliere expressies en [!...] bij filenaam wildcards. En volgens de Posix-standaard voor filenaam wildcards moet de hyphen tussen blokhaken zich gedragen conform de ingestelde locale. Dat kan betekenen dat het globbing gedrag case-insensitive wordt. Dus [a z] zal in dat geval ook op hoofdletters in de filenaam matchen. 6. Per l ReguliereExpressies Op dit punt in het verhaal maken we een grote stap voorwaarts: van Basic en Extended Regular Expressions gaan we nu naar de derde generatie: Perl Regular Expressions. Daarmee wordt het meteen een flink stuk ingewikkelder. Het is misschien verstandig om op dit punt op te houden met lezen en pas terug te komen als je ervaring met de BRE s en ERE s hebt opgedaan. De Perl Regular Expressions zijn vooral nuttig voor programmeurs. Maar ze zitten ook in zwaarkaliber gereedschap, zoals het URL-rewrite module van de Apache webserver. In commando saan de prompt, of in shell scripts,kom je ze niet zo vaak tegen. De scripttaal Perl heeft veel van zijn populariteit te danken aan het gebruik van reguliere expressies. Perl is in 1987 ontstaan, en was in 1995 bij versie 5 beland. Deze versie bracht vele uitbreidingen ten opzichte van ERE s. Dit is lange tijd de benchmark voor anderen geweest om zichaan te meten op dit vlak. De meeste script- en programmeertalen ondersteunen tegenwoordig in meer of mindere mate reguliere expressies. Ze implementeren daarbij doorgaans zoveel mogelijk de Perl syntax hiervoor. Soms is de ondersteuning ingebouwd in de taal, maar meestal zit de ondersteuning in een bibliotheek. In dit hoofdstuk komen de meeste uitbreidingen aan bod die Perl ons heeft gebracht. Om Perl reguliere expressies op vergelijkbare wijze te demonstreren zoals we eerder 3. Als 'gewone' commando s aan globbing doen dan is dat altijd omdat ze ergens anders moeten zoeken dan in de huidige directory. Bijv. ineen hele fileboom, in een tar-file of in een database van namen. 4. De GNU-versie van grep heeft de P vlag om Perl reguliere expressies te behandelen. Maar ter ere van de bedenker stappen we over op voorbeelden met het commando perl in plaats van grep.
18 Reguliere expressies 18 met grep 4 deden, hanteren we de volgende vorm op de commandoregel aan de prompt: $ perl ne print if (/regex/) tekstfile Dit laat perl de regels uit de tekstfile tonen waarin de gegeven regex matcht. Merk op dat in dit geval de regex tussen slashes wordt geplaatst. De slash is in Perl het scheidingsteken voor letterlijke reguliere expressies, net zoals letterlijke strings in de meeste talen tussen aanhalingstekens worden gezet. 6.1 Quantifier s Een eenvoudige uitbreiding op de bestaande {n,m}-varianten is: {,m} Dit betekent: nul tot en met m keer het voorgaande. Sommige regex-implementaties ondersteunen deze vorm niet. Je kunt dan natuurlijk ook gewoon {0,m} schrijven Lazy quantifier s (ma tch zo weinig mogelijk tekens) Veel belangrijker is de mogelijkheid om quantifiers lazy te maken. Tot nu toe zagen we quantifiers die altijd zo veel mogelijk tekens proberen te matchen, en die we daarom greedy noemen. Dus,gegeven de tekst: <p>een html paragraaf.</p><p>de tweede paragraaf.</p> met de volgende regex: <p>(.*)</p> levert een matchopdegroep (d.w.z. het gedeelte tussen haakjes): Een html paragraaf.</p><p>de tweede paragraaf. en dus niet slechts op: Een html paragraaf. Misschien was die lange match niet de bedoeling. Als je inderdaad slechts de tekst tussen het eerste <p>...</p>-paar in een groep wil 'vangen', kun je de * in de regex lazy maken. Dat betekent: matchzo weinig mogelijk tekens. Je maakt een quantifier lazy door er een vraagteken? achter te plaatsen. Dus als we de regex op die manier aanpassen zal de groep in: <p>(.*?)</p> in ons voorbeeld wel alleen Een html paragraaf. bevatten, omdat het matchen stopt bij de eerste </p>
19 Reguliere expressies Possessivequantifier s Er bestaat nog een derde vorm van quantifiers, waarvan het gedrag lijkt op lazy quantifiers, maar subtiel anders is. Je maakt een quantifier possessive door er een + (plus) achter te plaatsen. Dat ziet er dan bijv.zouit: *+ of {m,n}+ of?+ en zelfs ++ Een uitleg van de exacte werking en toepassing van possessive quantifiers valt buiten het bereik van dit artikel. Er is kennis over de interne werking van regeximplementaties nodig om dit te kunnen verduidelijken. 6.2 Grouping Grouping wordt op dezelfde wijze genoteerd als bij ERE s, dus tussen ronde haken, zoals in bovenstaand voorbeelden bij de lazy quantifiers al te zien was Non-captur ing groups Nieuw bij de Perl Regular Expressions is dat je nu expliciet kunt aangeven dat de gematchte tekens in de groep niet onthouden hoeven te worden voor later gebruik als backreference. Dat onthouden kost immers geheugen en extra werk, dus als je alleen haakjes zet om een paar tekens om ze te groeperen kun je het systeem dat werk besparen, en kan de zoekopdracht sneller worden uitgevoerd. Een groep waarvan de gematchte tekens niet hoeven te worden onthouden heet een non-capturing group. Je noteert een non-capturing group door direct na het haakjeopenen een vraagteken en een dubbele punt te plaatsen: abc(?:de)*fg In deze regex wordt de gegroepeerd, zodat de * op de hele groep werkt. De substring de hoeft verder niet onthouden te worden, vandaar dat we de groep non-capturing hebben gemaakt. De regex beschrijft dus: abc gevolgd door nul of meer keer de, gevolgd door fg. Let op: non-capturing groups tellen niet mee in de telling van capturing groups! Neem dus in je telling alleen de haakjes-openen mee die niet gevolgd worden door een vraagteken. In de regex: ab(cd)*e(?:gh)*i(jk)lm\1\2 refereert \1 naar cd,en \2 naar jk. Degroep met gh telt dus niet mee! Atomic grouping Atomic grouping wordt niet veel gebruikt, en voor het begrijpelijk uitleggen van wat het precies is, is kennis nodig over de interne werking van regex-implementaties. We laten ze in dit artikel verder buiten beschouwing. Ze zijn te herkennen aan een vraagteken en een > teken, direct na het haakje-openen. Dat ziet er zo uit: (?>Regex) Net als non-capturing groups tellen atomic groups niet mee bij de telling van
20 Reguliere expressies 20 groepen voor backreferencing. 6.3 Backreferences De notatie voor backreferences die we al kennen uit de BRE s en ERE s is gehandhaafd. Je kunt dus met \1 tot en met \9 refereren aan de eerste tot en met de negende groep. Ter herinnering: groepering gaat in BRE s met \(...\) en in ERE s met (...) Om meer dan 9 groepen te ondersteunen in een regex is een alternatieve notatie ingevoerd: \g{1} tot en met \g{99}. Hiermee verwijs je dus naar de eerste tot en met de negenennegentigste groep. 6.4 Character classes Handige afkor tingen Naast de bekende zelf samen te stellen verzamelingen tekens die op een bepaalde plek in een tekst mogen matchen, genoteerd met [...], zijn er enkele afkortingen toegevoegd voor veelgebruikte character classes. Op elke positie waar een white space character mag staan kun je \s noteren. Onder white space wordt begrepen: spatie, tab, linefeed, vertical tab, form feed, enz. Als de regex-implementatie Unicode ondersteunt vallen ook alle daar gedefinieerde vormen van white space eronder. Net zoals je in de [...]-notatie ook kunt aangeven dat je de genoemde tekens op die plek in de regex niet wilt matchen, door als eerste teken in de verzameling een ˆ te noteren als volgt [ˆ...], kun je ook aangeven dat je op een bepaalde plek in de regex juist geen white space wilt hebben. Je kunt dat noteren door \S te gebruiken, dus met een hoofdletter. Op vergelijkbare wijze stelt \d een cijfer voor, enisdus hetzelfde als [0 9] staat \D voor elk teken behalve een cijfer,dus [ˆ0 9] en Tenslotte is er \w voor een word character, wat gedefinieerd is als een letter, cijfer of underscore, dus: [a za Z0 9 ] Let op: als de regex-implementatie Unicode ondersteunt dan wordt het begrip letter een stuk breder opgevat. Daar vallen in dat geval ook alle variaties met accenten onder, enzelfs de verschillende lettertekens uit andere alfabetten dan het Latijnse, zoals Grieks, Cyrillisch, Arabisch, Hebreeuws enz. Net als bij de andere afkortingen kun je de betekenis omdraaien door een hoofdletter te gebruiken: \W staat voor elk teken dat geen letter,cijfer of underscore is. Samengevat:
21 Reguliere expressies 21 notatie betekenis \s whitespace \S alles behalve whitespace \w woordcharacter (letter,cijfer,underscore) \W alles behalve een woordcharacter \d cijfer \D alles behalve een cijfer Tabel 1. Korte notatie voor veelgebruikte character classes Unicode code points In regex-implementaties die Unicode ondersteunen kun je willekeurige tekens matchen via hun Unicode code point. Het copyright-teken ( ), bijvoorbeeld, heeft als Unicode code point U+00A9. Als je deze wilt opnemen in een regex, noteer je (in de meeste talen): \u00a9 Die notatie werkt niet in Perl en in PCRE, 5 waar je de volgende notatie gebruikt: \x{a9} Merk op dat je daarbij voorloopnullen mag weglaten. Deze notatie wordt niet verward met de quantifier {n}, omdat \x geen geldige losstaande notatie is. Wanneer je noteert: \x{2500}{50} wordt dat dus opgevat als 50 keer het code point U Het matchen van Unicode code points kent wel valkuilen. Sommige tekens hebben in Unicode meerdere representaties: geaccentueerde letters, bijvoorbeeld, hebben een concreet code point voor het gehele teken, maar kunnen ook beschreven worden met een code point voor de kale letter zonder accent, gevolgd door een speciaal code point voor het accent dat daarmee gecombineerd moet worden. Dus een é kan gerepresenteerd worden door U+00E9 (voor het hele teken), maar ook door de combinatie van e (U+0065), gevolgd door het accent (U+0301). 5. PCRE is de Perl Compatible Regular Expression library. Dit is een open source bibliotheek, geschreven door Philip Hazel van Cambridge University, die door C/C++-programmeurs gebruikt kan worden om reguliere expressies in hun eigen software te kunnen ondersteunen. De taal PHP en de MariaDB database ( opvolger van MySQL) zijn ook voorbeelden van waar de PCRE wordt gebruikt.
22 Reguliere expressies Unicode character classes Met Unicode-ondersteuning heb je de beschikking over een extra arsenaal aan character classes. Er is een aantal hoofdcategorieën, zoals letters, symbolen, diacritische tekens, interpunctie, en dergelijke, die elk weer zijn onderverdeeld in subcategorieën voor nog fijner onderscheid. Elke (sub)categorie kun je schrijven in een uitgebreide, leesbare vorm en in een afgekorte vorm. Een letter kun je aangeven als \p{letter} of als \p{l}. Een subcategorie van \p{letter} is bijvoorbeeld hoofdletter: \p{uppercase Letter}, afgekort als: \p{lu} Een overzicht van alle Unicode (sub)categorieën vind je in Appendix A van dit verhaal. 6.5 Anchors Bij de Perl Regular Expressions kun je met \b een woordgrens aangeven. Een woordgrens is de overgang tussen een word character en een niet-word character. Bedenk wel dat net als bij de eerder behandelde anchors (ˆ en $) deze geen breedte hebben! Een anchor geeft altijd een plek tussen twee tekens aan. Als je juist wilt aangeven dat je op een bepaalde plek in de regex geen woordgrens wilt matchen, gebruik je weer de hoofdletter-variant, dus: \B De regex \bvak\b matcht wel in de zin: Dit vak is soms best moeilijk. maar niet in: We gaan op vakantie. Maar als je woorden zou willen vinden die beginnen met vak, maar niet het losse woord vak, kun je dus de regex \bvak\b gebruiken. Die zou in de tweede zin wèl de eerste drie letters van het woord vakantie matchen. 6.6 Assertions Assertions bestaan niet in BRE s en ERE s. Dus dit is een nieuw begrip. Een assertion is te beschouwen als een programmeerbare anchor. Waar je bijvoorbeeld met de anchor \b aangeeft dat op die plek in de regex een woordgrens moet zijn, kun je met een assertion een willekeurige regex als test aangeven, waaraan de te matchen tekst moet voldoen op die plek. Net als een anchor heeft een assertion geen breedte, maar test hij of een positie tussen twee tekens aan een gegeven regex voldoet, of juist niet. Daarbij kan een assertion naar links (lookbehind)ofnaar rechts (lookahead)'kijken'. De combinaties van enerzijds wel of niet aan een test voldoen en anderzijds naar links of rechts kijken leveren vier soorten assertions op:
23 Reguliere expressies 23 notatie betekenis naam (?=regex) rechts hiervan moet regex matchen positive lookahead (?!regex) rechts hiervan mag regex niet matchen negative lookahead (?<=regex) links hiervan moet regex matchen positive lookbehind (?<!regex) links hiervan mag regex niet matchen negative lookbehind Tabel 2. Lookaround assertions De regex [a z](?=\d) matcht een kleine letter, gevolgd door een cijfer. Dat zou je ook kunnen vinden met [a z]\d, maar dan maakt het cijfer ook echt onderdeel uit van de match. Dat is van belang wanneer je de regex gebruikt bij zoeken gevolgd door vervangen: [a z]\d matcht in abc123 de substring c1 [a z](?=\d) matcht in abc123 de substring c Het is belangrijk te blijven beseffen dat een assertion nooit tekens matcht, maar slechts test of een bepaalde conditie geldt op een gegeven positie in de regex. Verder geldt ook hier dat assertions niet meetellen bij de telling van capturing groups. Voorbeeld: we tonen alle regels uit ons woordjes bestand, waarin een p voorkomt die niet door een a vooraf gegaan wordt. $ perl ne print if (/(?<!a)p/) woordjes Dat levert als resultaat de volgende matchende regels: appel aardappel pennen piet. lopen pellen. pinda pint We zien ook regels terug waarin wel een p met een a ervoor staat, maar in elk geval heeft zo n regel óók een p zonder a ervoor. Tenslotte nog een voorbeeld van een positive lookahead, die in de context van Perl negatief gebruikt wordt. We zijn op zoek naar de regels waarin niet twee maal dezelfde letter achter elkaar voorkomt. $ perl ne print unless (/(.)(?=\1)/) woordjes
24 Reguliere expressies 24 De regex matcht elke regel waarin een letter staat, direct gevolgd door dezelfde letter. Het woordje unless is Perl-taal om elke regel te laten printen, tenzij die matcht met de gegeven regex. Dit geeft de volgende outputregels als resultaat: piet. lopen pinda mat maria pint 6.7 Backtracking Bij gebruik van greedy quantifiers speelt het mechanisme van backtracking een rol. Dit houdt in dat de regex 'machine' tijdens het scannen van de tekst steeds in de gaten houdt op welke plek er een match is, en die plek onthoudt voor het geval later blijkt dat dit de langste match was. Als hij verderop in de tekst een langere match vindt, vergeet hij de eerste onthouden positie en onthoudt nu deze nieuwe. Bij het einde van de tekst aangekomen komt hij vaak tot de ontdekking dat er geen langere match is dan de laatst ontdekte, en keert hij op zijn schreden terug. Dat heet backtracking. Een mooi voorbeeld dat laat zien hoe je je met backtracking in de voet kunt schieten is de volgende combinatie van twee opeenvolgende greedy quantifiers. Met deze regex:.*(\d+) zoeken we een matchindetekst: ov9292 De strikvraag is: wat zit er in de groep? Antwoord: alleen de laatste 2! Verklaring: de * die op de. werkt probeert zoveel mogelijk tekens te matchen, liefst tot en met het laatste teken in de tekst aan toe! Bij het laatste teken aangekomen (de laatste 2), wordt geconstateerd dat er geen match is, tenzij er een stap terug wordt gedaan. De 2 blijft dan over voor het deel in de groep, dat één of meer cijfers wil matchen. Jeziet hier dat de eerste greedy quantifier het 'wint' van de tweede. Als we een vergelijkbare regex willen maken waarmee wel zoveel mogelijk van de cijfers terecht komen in de groep,dan lukt dat door de * lazy te maken: $ echo ov9292 perl ne print $1,"\n" if (/.*?(\d+)/) Dit zou een complete commandoregel zijn om deze match te testen. De $1 bij het print-statement is een Perl-specifieke back-reference notatie, die aangeeft dat we alleen het stukje willen printen dat door het groep-gedeelte van de regex gematcht wordt. Elke programmeertaal heeft zijn eigen manier om buiten een reguliere
25 Reguliere expressies 25 expressie te refereren naar de inhoud van een genummerde groep. 6.8 Er is meer mogelijk Er zijn met Perl regular expressions meer constructies mogelijk dan we hier behandeld hebben. Wat nog rest zijn specialistische expressies die buiten het bereik van dit artikel vallen. Wat hier wel behandeld is wordt door de meeste implementaties ondersteund, en is daardoor breed toepasbaar.
26 Reguliere expressies 26 A. Regular expression cheatsheet Huishoudelijk reglement: 1. Regex matcht alleen binnen één regel 2. De eerste matchtelt 3. Standaard quantifiers zijn greedy 4. Matching is case sensitive Metacharacter s: De volgende tekens moet je escapen met een backslash '\' als je ze letterlijk wil matchen: ˆ $ ( ) [ { \. * +? Anchor s: notatie betekenis ˆ begin van de regel $ eind van de regel \b woordgrens \B niet een woordgrens Alter nation: notatie eenregex andereregex betekenis matcht eenregex óf andereregex Quantifier s: Greedy:match zoveel mogelijk tekens. Lazy:matchzo weinig mogelijk tekens. Possessive:niet behandeld in dit artikel. betekenis greedy lazy possessive nul of meer * *? *+ een of meer + +? ++ nul of een????+ precies n {n} {n}? {n}+ minstens n {n,} {n,}? {n,}+ hoogstens m {,m} {,m}? {,m}+ n tot en met m {n,m} {n,m}? {n,m}+
27 Reguliere expressies 27 Grouping: notatie (regex) (?:regex) (?>regex) betekenis regex is een groep; wat matcht wordt onthouden (capturing group) regex is een groep; wat matcht wordt niet onthouden (noncapturing group),enniet genummerd atomic grouping (niet behandeld in dit artikel) Character classes: notatie betekenis \s whitespace \S niet whitespace \w woordcharacter (letter,cijfer,underscore) \W niet een woordcharacter \d cijfer \D niet een cijfer [...] verzameling gewenste tekens en/of combinatie van character classes [ˆ...] verzameling ongewenste tekens en/of combinatie van character classes [a z] range van a tot en met z Unicode character class categor ies: afgekort lange vorm betekenis \p{l} \p{letter} letter,van wat voor alfabet dan ook \p{m} \p{mark} een teken dat bedoeld is te combineren met een ander teken \p{z} \p{separator} elke soort witruimte of onzichtbaar scheidingsteken \p{s} \p{symbol} wiskundige symbolen, lijntjes,valutatekens,enz. \p{n} \p{number} numeriek teken \p{p} \p{punctuation} interpunctie \p{c} \p{other} onzichtbare stuurtekens en ongebruikte code points Unicode subcategor ieën:
28 Reguliere expressies 28 afgekort lange vorm betekenis \p{ll} \p{lowercase Letter} kleine letter die een hoofdlettervariant heeft \p{lu} \p{uppercase Letter} hoofdletter die een kleine lettervariant heeft \p{lt} \p{titlecase Letter} hoofdletter aan het begin van een woord \p{l&} \p{cased Letter} combinatie van \p{ll}, \p{lu} en \p{lt} \p{lm} \p{modifier Letter} speciaal teken dat gebruikt wordt als letter \p{lo} \p{other Letter} letter die geen hoofd- en klein onderscheid heeft \p{mn} \p{non Spacing Mark} een teken dat bedoeld is om gecombineerd te worden met een ander teken, zonder extra ruimte in beslag te nemen (bijv.umlaut, accenten, enz.) \p{mc} \p{spacing Combining Mark} een teken dat bedoeld is om gecombineerd te worden met een ander teken, dat daarbij wel extra ruimte in beslag neemt (klinker-tekens in oosterse talen) \p{me} \p{enclosing Mark} een teken dat het teken insluit waarmee het gecombineerd wordt (bijv.cirkel, vierkant, toetsenbord-toets) \p{zs} \p{space Separator} een onzichtbaar witruimte-teken dat wel ruimte in beslag neemt \p{zl} \p{line Separator} regelscheider U+2028 \p{zp} \p{paragraph Separator} alineascheider U+2029 \p{sm} \p{math Symbol} elk wiskundig symbool \p{sc} \p{currency Symbol} elk valutateken \p{sk} \p{modifier Symbol} een te combineren teken, maar dan zelfstandig \p{so} \p{other Symbol} verschillende symbolen die niet in een bovenstaande subcategorie vallen \p{nd} \p{decimal Digit Number} cijfer 0 tot en met 9 \p{nl} \p{letter Number} een cijfer dat er uitziet als een letter, zoals een romeins cijfer \p{no} \p{other Number} een sub- of superscript cijfer,ofeen ander cijfer dat niet 0-9 is \p{pd} \p{dash Punctuation} elke soort liggend streepje \p{ps} \p{open Punctuation} elke soort haakje openen \p{pe} \p{close Punctuation} elke soort haakje sluiten \p{pi} \p{initial Punctuation} elke soort aanhalingsteken openen \p{pf} \p{final Punctuation} elke soort aanhalingsteken sluiten \p{pc} \p{connector Punctuation} een verbindingsteken zoals underscore \p{po} \p{other Punctuation} elke soort interpunctie die niet onder bovenstaande subcategorieën valt \p{cc} \p{control} een ASCII 0x00-0x1F of Latin-1 0x80-0x9F stuurteken
29 Reguliere expressies 29 \p{cf} \p{format} onzichtbaar vormgevingsteken \p{co} \p{private Use} elk code point gereserveerd voor eigen gebruik \p{cs} \p{surrogate} de helft van een surrogaat-paar in UTF-16 \p{cn} \p{unassigned} elk code point waaraan nog geen teken is toegekend POSIX character classes en hun ASCII en Unicode equivalenten: POSIX betekenis ASCII Unicode [:alnum:] alfanumeriek teken [a za Z0 9] [\p{l}\{nl}\p{nd}] [:alpha:] alfabetischteken [a za Z] [\p{l}\p{nl}] [:ascii:] ASCII teken [\x00 \x7f] \p{inbasiclatin} [:blank:] spatie of tab [ \t] [\p{zs}\t] [:cntrl:] stuurteken [\x00 \x1f\x7f] \pcc [:digit:] cijfer [0 9] \p{nd} [:graph:] zichtbaar teken [\x21 \x7e] [\p{z}\p{c}] [:lower:] kleine letter [a z] \p{ll} [:print:] zichtbaar teken of spatie [\x20 \x7e] \P{C} [:punct:] [:space:] interpunctie en symbolen alle witruimte-tekens [!"\#$%& () *+,\./:;<=>?@\[\\\]ˆ { } ] [ \t\n\r\v\f] \p{p} [\p{z}\t\n\r\v\f] [:upper:] hoofdletter [A Z] \p{lu} [:word:] woord-teken [A Za z0 9 ] [\p{l}\p{nl} \p{nd}\p{pc}] [:xdigit:] hexadecimaal teken [a fa F0 9] [a fa F0 9] Backreferences: Telling: capturing groups zijn genummerd vanaf 1 in de volgorde van de haakjesopenen '(' notatie betekenis (met k = 1, 2,..., 9) \k gematchte tekst van de k-de groep (alleen binnen de regex) Lookaround assertions: Deze worden net als non-capturing groups met haakjes genoteerd, waarbij binnen de haakjes eerst een vraagteken volgt. Deze vormen tellen niet mee met de nummering van capturing groups!
30 Reguliere expressies 30 notatie betekenis naam (?=regex) rechts hiervan moet regex matchen positive lookahead (?!regex) rechts hiervan mag regex niet matchen negative lookahead (?<=regex) links hiervan moet regex matchen positive lookbehind (?<!regex) links hiervan mag regex niet matchen negative lookbehind Backtracking: Probeer te matchen vanaf het begin. Meerdere mogelijkheden? Onthoud huidige plek en mogelijkheden. Probeer er een. Geen match? Keer terug naar laatst onthouden plek en probeer volgende mogelijkheid. Geen mogelijkheden meer? Ga verder totdat ofwel een match is gevonden, ofwel de hele matchfaalt. Flags: De meeste regex implementaties bieden de mogelijkheid om het gedrag van de regex machine te beïnvloeden. Dit gaat met een soort 'schakelaars' die aan of uit staan; ze worden vaak flags genoemd. Het precieze gebruik van deze flags is afhankelijk van de omgeving (commando, programmeertaal) waar je de reguliere expressies gebruikt. Veel programmeertalen gebruiken niet de onderstaande enkelvoudige flag-letters om opties voor het matchen aan te geven. In plaats daarvan moet je als programmeur extra argumenten meegeven aan de functies die het matchen voor je doen. Deze argumenten hebben vaak de vorm van voorgedefinieerde constanten, die in de bijbehorende documentatie worden beschreven. De volgende flags worden doorgaans ondersteund: flag betekenis uitleg i case insensitive geen onderscheid hoofd- en kleine letters g global search doorgaan na de eerste match(bv.bij search&replace) s single-line text. (willekeurig teken) matcht ook op \n m multi-line anchors anker ˆ matcht ook achter \n en $ matcht ook vóór \n x comment mode whitespace negeren; commentaar mag achter #
Reguliere expressies
Reguliere expressies 1. Introductie Reguliere expressies vormen een specificatie-taal die een rol speelt als je in een grote hoeveelheid tekst een bepaald stukje zoekt. Het zoekwerk laat je door je computer
Reguliere Expressies
Reguliere Expressies Een reguliere expressie (regexp, regex, regxp) is een string (een woord) die, volgens bepaalde syntaxregels, een verzameling strings (een taal) beschrijft Reguliere expressies worden
Tekstmanipulatie. Week 3: Reguliere expressies. Gosse Bouma 2007/2008. Informatiekunde Rijksuniversiteit Groningen
Tekstmanipulatie Week 3: Reguliere expressies Gosse Bouma [email protected] Informatiekunde Rijksuniversiteit Groningen 2007/2008 Gosse Bouma 1/38 Overzicht 1 Wildcards 2 Keuze 3 Ranges 4 Begin en Eind van
maplev 2010/7/12 14:02 page 15 #17 Nadere detaillering van een aantal zaken van Module 1 Geen,, " ", \, save, read, protect, unprotect
maplev 2010/7/12 14:02 page 15 #17 Module 2 Het gebruik van Maple, vervolg Onderwerp Voorkennis Expressies Nadere detaillering van een aantal zaken van Module 1 Geen,, " ", \, save, read, protect, unprotect
Korte uitleg: Wat doet de shell met mijn commandoregel?
Korte uitleg: Wat doet de shell met mijn commandoregel? Het onderstaande is heel erg Bash gericht, maar geldt i.h.a. ook voor andere shells. Vooral als het om "begrip" gaat. Iedere regel die aan de shell
Korte uitleg: Haakjes en Aanhalingstekens
Korte uitleg: Haakjes en Aanhalingstekens Wie naar een wat ingewikkelder bash script kijkt ziet een verwarrende hoeveelheid van allerlei soorten haakjes en aanhalingstekens. Die verwarring is normaal gezien
Opgaven. Python Assessment
Opgaven Python Assessment Nijmegen - Utrecht www.atcomputing.nl Copyright 2015,2016 Versie: 1a Inleiding Met dit assessment kun je controleren of je voldoende parate kennis over Python hebt om te beginnen
Elementaire rekenvaardigheden
Hoofdstuk 1 Elementaire rekenvaardigheden De dingen die je niet durft te vragen, maar toch echt moet weten Je moet kunnen optellen en aftrekken om de gegevens van de patiënt nauwkeurig bij te kunnen houden.
Uitleg: In de bovenstaande oefening zie je in het eerste blokje een LEES en een SCHRIJF opdracht. Dit is nog lesstof uit het tweede trimester.
In onderstaande oefeningen zijn kleuren gebruikt. Deze dienen aleen om de structuren makkelijker terug te kunnen herkennen. Ze worden niet standaard zo gebruikt. De dunne rood/roze balken zijn ook geen
HOOFDSTUK 3. Imperatief programmeren. 3.1 Stapsgewijs programmeren. 3.2 If Then Else. Module 4 Programmeren
HOOFDSTUK 3 3.1 Stapsgewijs programmeren De programmeertalen die tot nu toe genoemd zijn, zijn imperatieve of procedurele programmeertalen. is het stapsgewijs in code omschrijven wat een programma moet
Extra s. Extra s bij HTML en CSS - de basis, 3e editie. X X Extra tekst: subscript en superscript. Extra tekst: entiteiten
Extra s bij HTML en CSS - de basis, 3e editie X X Extra tekst: subscript en superscript XX Extra tekst: entiteiten GEEN DOCTYPE In de meeste browsers kun je de html-code van een webpagina bekijken (zoek
Niet-numerieke data-types
Intern wordt een karakter voorgesteld als een rij van acht bits, Niet-numerieke data-types string de letter a 01100001 0110 0001 0x61 97 Bij interpretatie van de inhoud van een byte als een geheel getal,
Uitwerkingen. Python Assessment
Uitwerkingen Python Assessment Nijmegen - Utrecht www.atcomputing.nl Copyright 2015,2016 Versie: 1a Uitwer king 1: Elementairedatatypes 1.a Een string bevat tekst in de vorm van Unicode characters, terwijl
van PSD naar JavaScript
2015 van PSD naar JavaScript F. Vonk versie 2 19-9-2015 inhoudsopgave 1. inleiding... - 2-2. ontwikkelomgeving... - 3-3. programmeerconcepten... - 4 - statement... - 4 - sequentie... - 4 - variabele en
Regular Expressions in Java (1)
Sinds versie 1.4 zijn Regular Expressions (kortweg RegEx) onderdeel van Java. Deze kunnen veel code terugbrengen tot slechts enkele statements. In het eerste deel uit een serie van twee artikelen van Jesse
BEGINNER JAVA Inhoudsopgave
Inhoudsopgave 6 Configuratie Hallo wereld! Praten met de gebruiker Munt opgooien Voorwaarden Lussen......6 Configuratie Met deze Sushi kaarten ga je een simpel spel maken met één van de meest populaire
Je gaat leren programmeren en een spel bouwen met de programmeertaal Python. Websites zoals YouTube en Instagram zijn gebouwd met Python.
1 Je gaat leren programmeren en een spel bouwen met de programmeertaal Python. Websites zoals YouTube en Instagram zijn gebouwd met Python. Voordat je leert programmeren, moet je jouw pc zo instellen dat
Gebruik van command-line operating systems
Gebruik van command-line operating systems Mattias Holm & Kristian Rietveld Overzicht - Waarom hier meer over leren? - Wat is een shell? - Hoe werkt een shell? - Pipes en redirectie - Handige utilities
De tag aan het begin van het PHPscript is "<?php" aan het einde van het PHPscript gebruik je "?>".
PHP Les 3 Commando ECHO Interessante links: o http://www.donboscozwijnaarde.be/~moermant/ o http://php.net/manual/en/function.echo.php o http://www.w3schools.com/php/default.asp Wat is PHP? PHP is een
Lab Webdesign: Javascript 3 maart 2008
H5: OPERATORS In dit hoofdstuk zullen we het hebben over de operators (of ook wel: operatoren) in JavaScript waarmee allerlei rekenkundige en logische bewerkingen kunnen worden uitgevoerd. Daarbij zullen
Automaten. Informatica, UvA. Yde Venema
Automaten Informatica, UvA Yde Venema i Inhoud Inleiding 1 1 Formele talen en reguliere expressies 2 1.1 Formele talen.................................... 2 1.2 Reguliere expressies................................
Installatie Software - Opdrachten Les 2
Installatie Software - Opdrachten Les 2 ROC van Amsterdam Gooi en Vechtstreek Naam: Klas: Datum: 2010 Jansn 1 van 11 is een operating system dat ten grondslag ligt aan de verschillende versies van Windows.
PHP. Les 4 : Variabelen
PHP Les 4 : Variabelen Interessante links: o http://www.dbzweb.be/moermant/ o http://php.net/manual/en/function.echo.php o http://www.w3schools.com/php/default.asp Wat zijn variabelen? Variabelen zijn
Je gaat leren programmeren in Ruby. En daarna in Ruby een spelletje maken. Websites zoals Twitch en Twitter gemaakt zijn met behulp van Ruby?
1 Je gaat leren programmeren in Ruby. En daarna in Ruby een spelletje maken. Websites zoals Twitch en Twitter gemaakt zijn met behulp van Ruby? Voordat je begint met programmeren, moet je Ruby installeren.
PYTHON REEKS 1: BASICS. Mathias Polfliet
PYTHON REEKS 1: BASICS Mathias Polfliet [email protected] EENVOUDIGE REKENMACHINE 2 soorten getallen Getallen Z -> integers (gehele getallen) Getallen R -> floating points (reële getallen) Door beperkte
Computervaardigheden. Universiteit Antwerpen. Computervaardigheden en Programmatie. Grafieken en Rapporten 1. Inhoud. Wat is scripting?
Inhoud Computervaardigheden Hoofdstuk 4 Scripting (Let op: dit is enkel voor studenten Biologie.) Dit hoofdstuk bekijkt heel kort de basis van scripting. - Opstellen van functies. - Conditionele code.
Breuken met letters WISNET-HBO. update juli 2013
Breuken met letters WISNET-HBO update juli 2013 De bedoeling van deze les is het repeteren met pen en papier van het werken met breuken. Steeds wordt bij gebruik van letters verondersteld dat de noemers
Het omzetten van reguliere expressies naar eindige automaten, zie de vakken Fundamentele Informatica 1 en 2.
Datastructuren 2016 Programmeeropdracht 3: Patroonherkenning Deadlines. Woensdag 23 november 23:59, resp. vrijdag 9 december 23:59. Inleiding. Deze opdracht is gebaseerd op Hoofdstuk 13.1.7 in het boek
Als een PSD selecties bevat, deelt de lijn van het programma zich op met de verschillende antwoorden op het vraagstuk.
HOOFDSTUK 3 3.1 Stapsgewijs programmeren In de vorige hoofdstukken zijn programmeertalen beschreven die imperatief zijn. is het stapsgewijs in code omschrijven wat een programma moet doen, net als een
+ = Talstelsels. Maar wat is dan: -
Talstelsels Wie leert rekenen doet dat in het begin vaak met z n vingers erbij: 1 + 4 = Elke vinger krijgt een naam : één, twee,.tien. Eigenlijk is er helemaal geen sprake van rekenen, maar van tellen:
OEFENINGEN PYTHON REEKS 1
Vraag 1: Expressies & Types OEFENINGEN PYTHON REEKS 1 Python maakt gebruik van enkele vaak voorkomende (data)types. Zo zijn er integers die behoren tot de gehele getallen (VB: 3), zijn er float s die behoren
Zoeken in de digitale collecties van de NVBS Bibliotheek versie 25oktober 2014
Zoeken in de digitale collecties van de NVBS Bibliotheek versie 25oktober 2014 Inleiding De bibliotheek collecties hebben twee verschillende zoekmogelijkheden: grasduinen (browsen) en zoeken. Bij grasduinen
3. Structuren in de taal
3. Structuren in de taal In dit hoofdstuk behandelen we de belangrijkst econtrolestructuren die in de algoritmiek gebruikt worden. Dit zijn o.a. de opeenvolging, selectie en lussen (herhaling). Vóór we
Kennismaking met programmeren
Kennismaking met programmeren werkblad binair tellen Project van de Pedagogische Academie, Hanzehogeschool Groningen en Groningen Programmeert in samenwerking met: Bij deze opdracht gaan jullie zelf leren
SQL Aantekeningen 3. Maarten de Rijke [email protected]. 22 mei 2003
SQL Aantekeningen 3 Maarten de Rijke [email protected] 22 mei 2003 Samenvatting In deze aflevering: het selecteren van tuples, operaties op strings, en aggregatie functies. Verder kijken we naar iets
OEFENINGEN PYTHON REEKS 1
Vraag 1: Expressies & Types OEFENINGEN PYTHON REEKS 1 Python maakt gebruik van enkele vaak voorkomende (data)types. Zo zijn er integers die behoren tot de gehele getallen (VB: 3), zijn er float s die behoren
Numerieke benadering van vierkantwortels
HP Prime Grafische Rekenmachine Numerieke benadering van vierkantwortels Doel: De waarde van een vierkantswortel met een recursieve rij benaderen, het schrijven van een klein programma. Sleutelwoorden:
Module 3: Scratch programmeren: is het logisch of is het niet logisch?
Module 3: Scratch programmeren: is het logisch of is het niet logisch? Inhoudsopgave Module 3: Scratch programmeren: is het logisch of is het niet logisch?...1 Wat is een computerprogramma eigenlijk?...2
Instellen Finchline Topics & Booleaans zoeken
Instellen Finchline Topics & Booleaans zoeken Versie 3.0 Introductie In deze handleiding wordt uitgelegd hoe je in Finchline topics kunt instellen. Een topic is een zoekactie naar een bepaald onderwerp.
start -> id (k (f c s) (g s c)) -> k (f c s) (g s c) -> f c s -> s c
Een Minimaal Formalisme om te Programmeren We hebben gezien dat Turing machines beschouwd kunnen worden als universele computers. D.w.z. dat iedere berekening met natuurlijke getallen die met een computer
Rekenen met de GRM. 1 van 1. Inleiding: algemene zaken. donkerder. lichter
1 van 1 Rekenen met de GRM De grafische rekenmachine (voortaan afgekort met GRM) ga je bij hoofdstuk 1 voornamelijk als gewone rekenmachine gebruiken. De onderste zes rijen toetsen zijn vergelijkbaar met
OEFENINGEN PYTHON REEKS 1
OEFENINGEN PYTHON REEKS 1 Vraag 1: Python als een eenvoudige rekenmachine Python maakt gebruik van enkele vaak voorkomende (data)types. Zo zijn er integers die behoren tot de gehele getallen (VB: 3) en
[8] De ene 1 is de andere niet
[8] De ene 1 is de andere niet Volg mee via 08_Types.py In de volgende leerfiche gaan we rekenen met Python. Dat kan je in een programma doen, maar dat kan je ook gewoon vanuit het Shell-venster doen.
THEORIE TALSTELSELS. 1 x 10 0 = 1 (een getal tot de macht 0 = 1) 8 x 10 1 = 80 2 x 10 2 = x 10 3 = Opgeteld: 9281d(ecimaal)
THEORIE TALSTELSELS De binaire code Het geheugenelement van de computer kan slechts twee verschillende waarden bevatten. De schakelingen uit de computer werken daarom met een tweetallig ofwel binair stelsel.
Beknopte handleiding Dragon NaturallySpeaking. Premium versie 13
1 Beknopte handleiding Dragon NaturallySpeaking Premium versie 13 1 Eerste gebruik van Dragon: installatie en een gebruikersprofiel aanmaken De spraakherkenningssoftware Dragon is beschikbaar als vaste
opgaven formele structuren deterministische eindige automaten
opgaven formele structuren deterministische eindige automaten Opgave. De taal L over het alfabet {a, b} bestaat uit alle strings die beginnen met aa en eindigen met ab. Geef een reguliere expressie voor
Rekenen aan wortels Werkblad =
Rekenen aan wortels Werkblad 546121 = Vooraf De vragen en opdrachten in dit werkblad die vooraf gegaan worden door, moeten schriftelijk worden beantwoord. Daarbij moet altijd duidelijk zijn hoe de antwoorden
Regular Expressions in Java (2)
In het eerste deel van deze serie (Java Magazine nr. 1, april 2006) lieten Jesse Houwing en Peter van den Berkmortel zien dat je met Reguliere Expressies veel code kunt besparen. We zagen onder andere
Handleiding JCreator. Inhoud. Een Workspace en een eerste project maken
Handleiding JCreator Inhoud Een Workspace en een eerste project maken Een tweede project maken De editor van JCreator Aanpassen van de basis-directory Documentatie over klassen en methoden van de JDK Bestand
Beknopte handleiding voor Derive 5.0 for Windows
- Lesbrief Beknopte handleiding voor Derive 5.0 for Voorspelbaarheid en Populaties in de tijd Doelgroep Klas 5 t/m 6 havo en vwo Vakken en domeinen Algemene natuurwetenschappen VWO Wiskunde VWO: A domein
1.3 Rekenen met pijlen
14 Getallen 1.3 Rekenen met pijlen 1.3.1 Het optellen van pijlen Jeweetnuwatdegetallenlijnisendat0nochpositiefnochnegatiefis. Wezullen nu een soort rekenen met pijlen gaan invoeren. We spreken af dat bij
Hoofdstuk 17: Logische & Informatiefuncties en operatoren
Hoofdstuk 17: Logische & Informatiefuncties en operatoren 17.0 Inleiding Logische formules testen of een conditie waar is (het resultaat van de formule zal dan de waarde WAAR hebben) of onwaar (in dit
Waarden persistent (blijvend) opslaan gaat in bestanden (files). Lege tekst: eof
Programmeren Blok A Persistente opslag van waarden http://www.win.tue.nl/ wstomv/edu/2ip05/ College 4 Tom Verhoeff Technische Universiteit Eindhoven Faculteit Wiskunde en Informatica Software Engineering
Voorbeeld: Simulatie van bewegende deeltjes
Voorbeeld: Simulatie van bewegende deeltjes Simulatie - object Ruimte - objecten Deeltje - objecten Button - objecten Simulatie Samenhang van objecten sim geërfd van Form stap zelf gedeclareerd auto r1
Bijlage D. Binair rekenen
Bijlage D Binair rekenen Bits, bytes en computerwoorden Alle huidige computersystemen zijn gebaseerd op digitale logica. Elk geheugenelement kent een geladen en een niet-geladen positie. Vaak wordt dit
Uitwerkingen Rekenen met cijfers en letters
Uitwerkingen Rekenen met cijfers en letters Maerlant College Brielle 5 oktober 2009 c Swier Garst - RGO Middelharnis 2 Inhoudsopgave Rekenen met gehele getallen 7. De gehele getallen.....................................
Variabelen en statements in ActionScript
Ontwikkelen van Apps voor ios en Android Variabelen en statements in ActionScript 6.1 Inleiding Als we het in de informatica over variabelen hebben, bedoelen we een stukje in het geheugen van de computer
Handleiding Word>Markdown
Handleiding Word>Markdown Voor het laten zien van de geschiedenis van bepaalde huizen op de website gaan we een bepaalde vorm van Markdown gebruiken. Markdown is een manier waarop je simpel tekst een bepaalde
DE INTERACTIEVE SHELL
Hoofdstuk2 De interactieve shell 6 Hoofdstuk 2 DE INTERACTIEVE SHELL In dit hoofdstuk behandelen we: Integers (gehele getallen) en getallen met drijvende komma Expressies Waarden Operatoren Het evalueren
Introductie tot het werken met een commandoregel
Introductie tot het werken met een commandoregel 23 december 2004 (C) AT Computing, Nijmegen, 2004 Introductie Het volgen van een cursus waarbij een commandoregel wordt gebruikt, wil nog wel eens tegenvallen
Zo gaat jouw kunstwerk er straks uitzien. Of misschien wel heel anders.
Spirograaf in Python Een kunstwerk maken Met programmeren kun je alles maken! Ook een kunstwerk! In deze les maken we zelf een kunstwerk met Python. Hiervoor zal je werken met herhalingen en variabelen.
Inhoudsopgave Disclaimer... 3 Voorwoord... 4 Inleiding... 5 Het downloaden van XAMPP... 7 Het installeren van XAMPP... 8 Joomla installeren op
1 Inhoudsopgave Disclaimer... 3 Voorwoord... 4 Inleiding... 5 Het downloaden van XAMPP... 7 Het installeren van XAMPP.... 8 Joomla installeren op XAMPP... 15 Handige links... 16 2 Disclaimer Bij de samenstelling
Opgaven Registers Concurrency, 29 nov 2018, Werkgroep.
Opgaven Registers Concurrency, 29 nov 2018, Werkgroep. Gebruik deze opgaven om de stof te oefenen op het werkcollege. Cijfer: Op een toets krijg je meestal zes tot acht opgaven. 1. Safe Integer: Van een
TELEPORTEREN MET VARIABELEN
2 TELEPORTEREN MET VARIABELEN Ben je zover dat je de kracht van Python kunt gebruiken om jouw Minecraft wereld te beheersen? In dit hoofdstuk krijg je een korte rondleiding langs de basisbegrippen van
Automaten & Complexiteit (X )
Automaten & Complexiteit (X 401049) Beschrijven van reguliere talen Jeroen Keiren [email protected] VU University Amsterdam 5 Februari 2015 Talen Vorig college: Talen als verzamelingen Eindige automaten:
1 Inleiding in Functioneel Programmeren
1 Inleiding in Functioneel Programmeren door Elroy Jumpertz 1.1 Inleiding Aangezien Informatica een populaire minor is voor wiskundestudenten, leek het mij nuttig om een stukje te schrijven over een onderwerp
Herwig s Tip van de dag
Herwig s Tip van de dag Word [email protected] Wie zoekt, die vindt Trefwoorden: Zoeken en vervangen Jokertekens Het zoeken en vervangen zijn basisfuncties in tekstverwerking die iedereen wel vaker gebruikt.
Simon de schildpad. 2012 J van Weert 1
Programmeren met Simon Simon de schildpad 2012 J van Weert 1 Inleiding: Wat is programmeren eigenlijk? Een computer doet niets zonder een programma. Die programma s worden geschreven door mensen: programmeurs.
Simon de schildpad. 2015 J van Weert 1
Programmeren met Simon Simon de schildpad 2015 J van Weert 1 Inleiding: Wat is programmeren eigenlijk? Een computer doet niets zonder een programma. Die programma s worden geschreven door mensen: programmeurs.
Vereiste kennis. 1 Java-editor. 2 Het compileren van een programma
3 Vereiste kennis Dit boek richt zich op het leren programmeren door het oefenen met programmeercodes. Veel theorie komt in het begin niet aan de orde. Dat is een grote uitdaging want het is niet makkelijk
1 Delers 1. 3 Grootste gemene deler en kleinste gemene veelvoud 12
Katern 2 Getaltheorie Inhoudsopgave 1 Delers 1 2 Deelbaarheid door 2, 3, 5, 9 en 11 6 3 Grootste gemene deler en kleinste gemene veelvoud 12 1 Delers In Katern 1 heb je geleerd wat een deler van een getal
Aanvullende tekst bij hoofdstuk 1
Aanvullende tekst bij hoofdstuk 1 Wortels uit willekeurige getallen In paragraaf 1.3.5 hebben we het worteltrekalgoritme besproken. Dat deden we aan de hand van de relatie tussen de (van tevoren gegeven)
Vragen. Terugkomcursus Met Sprongen Vooruit groep 3 en 4
Vragen Terugkomcursus Met Sprongen Vooruit groep 3 en 4 Inhoudsopgave blz. Oefenonderdelen Leren tellen 2 Ordenen en lokaliseren 3 Springen naar getallen 4 Aanvullen tot 10 5 Splitsingen 6 Sprong van 10
Programmeren: Visual Basic
PETERSTUYVESANT COLLEGE INFORMATICA 2009-2010 Programmeren: Visual Basic Document Afbaking 01. VERSCHILLENDE PROGRAMMEERTALEN 02. PROGRAMMEER PAKKETTEN 03. GUI 03.1 GUI ELEMENTEN 03.2 GUI EIGENSCHAPPEN
Javascript oefenblad 1
Leer de basis van Javascript. Javascript oefenblad 1 Niels van Velzen Javascript oefenblad 1 Pagina 2 Inleiding Javascript is niet altijd even makkelijk. Vooral aan het begin is het even wennen hoe de
Het programma in dit hoofdstuk vertelt een paar moppen aan de gebruiker.
Hoofdstuk 5 Moppen 36 Hoofdstuk 5 MOPPEN In dit hoofdstuk behandelen we: Het gebruik van het sleutelwoord end als argument in de print-functie om niet naar een nieuwe regel te gaan Escape-tekens Het gebruik
Een topprogrammeur in het OO programmeren is Graig Larman. Hij bedacht de volgende zin:
Java Les 2 Theorie Beslissingen Algemeen Net als in het dagelijks leven worden in software programma s beslissingen genomen, naast het toekennen van waarden aan variabelen zijn beslissingen één van de
MACHINES. ... en kralenkettingen. Onderzoeksprogramma Vierkant voor Wiskunde. Wiskundeclubs. Tristan Cranendonk & Joost Langeveld
MACHINES... en kralenkettingen. Onderzoeksprogramma Vierkant voor Wiskunde Wiskundeclubs Tristan Cranendonk & Joost Langeveld Kralenketting machines 1 Uitleg van de gebruikte symbolen: In de kantlijn staan
Examen Programmeren 2e Bachelor Elektrotechniek en Computerwetenschappen Faculteit Ingenieurswetenschappen Academiejaar juni, 2010
Examen Programmeren 2e Bachelor Elektrotechniek en Computerwetenschappen Faculteit Ingenieurswetenschappen Academiejaar 2009-2010 16 juni, 2010 **BELANGRIJK** 1. Schrijf je naam onderaan op elk blad. 2.
De hele noot Deze noot duurt 4 tellen
HERHALING KLAS 1. In de eerste klas heb je geleerd hoe je een melodie of een ritme moet spelen. Een ritme is een stukje muziek dat je kunt klappen of op een trommel kunt spelen. Een ritme bestaat uit lange
Tutorial voor FTP, STMP en Telnet
Tutorial voor FTP, STMP en Telnet Created by Benny Wouters on December 26, 2003 (1) Telnet commando s 1.1 Tabel met telnet commando s TELNET [host [port]] Open host [port] telnet sessie opstarten Maak
Programmeermethoden. Controle-structuren. Walter Kosters. week 3: september kosterswa/pm/
Programmeermethoden Controle-structuren Walter Kosters week 3: 17 21 september 2018 www.liacs.leidenuniv.nl/ kosterswa/pm/ 1 Inleveren opgave 1 Inleveren: digitaal clintonobama1.cc en print van mooi.pdf.
Voorbeeld casus mondeling college-examen
Voorbeeld casus mondeling college-examen Examenvak en niveau informatica vwo Naam kandidaat Examennummer Examencommissie Datum Voorbereidingstijd Titel voorbereidingsopdracht 20 minuten van analoog naar
Zelftest Inleiding Programmeren
Zelftest Inleiding Programmeren Document: n0824test.fm 22/01/2013 ABIS Training & Consulting P.O. Box 220 B-3000 Leuven Belgium TRAINING & CONSULTING INLEIDING BIJ DE ZELFTEST INLEIDING PROGRAMMEREN Deze
Inhoudsopgave... 1 Disclaimer... 3 Voorwoord... 3 Inleiding... 5 Het downloaden van XAMPP... 7 Het installeren van XAMPP... 8 Joomla installeren op
1 Inhoudsopgave... 1 Disclaimer... 3 Voorwoord... 3 Inleiding... 5 Het downloaden van XAMPP... 7 Het installeren van XAMPP... 8 Joomla installeren op XAMPP... 14 Handige links... 15 2 Disclaimer Bij de
Programmeermethoden NA. Week 5: Functies (vervolg)
Programmeermethoden NA Week 5: Functies (vervolg) Kristian Rietveld http://liacs.leidenuniv.nl/~rietveldkfd/courses/prna/ Bij ons leer je de wereld kennen 1 Functies Vorige week bekeken we functies: def
5.327 703 x 15.981 3.728.900 + 3.744.881. 2.160 3.007 x 15.120 6.480.000 + 6.495.120. 2.160 3.007 x 15.120 00.000 0 00.000 6.480.000 + 6.495.
Bij vermenigvuldigen van twee grote getallen onder elkaar staan de rijen onder de streep elk voor een tussenstap. De eerste rij staat voor het vermenigvuldigen met het cijfer dat de eenheden van het onderste
Rekenen met cijfers en letters
Rekenen met cijfers en letters Maerlant College Brielle 5 oktober 009 c Swier Garst - RGO Middelharnis Inhoudsopgave Rekenen met gehele getallen 7. De gehele getallen.....................................
3 Wat is een stelsel lineaire vergelijkingen?
In deze les bekijken we de situatie waarin er mogelijk meerdere vergelijkingen zijn ( stelsels ) en meerdere variabelen, maar waarin elke vergelijking er relatief eenvoudig uitziet, namelijk lineair is.
b. Van veel apparaten bestaat een digitale variant naast de normale. Denk bijvoorbeeld aan klokken en thermometers.
H1P1 Opdracht 1 Digitaal a. Wat betekent het woord digitaal? In getallen. b. Van veel apparaten bestaat een digitale variant naast de normale. Denk bijvoorbeeld aan klokken en thermometers. Beschrijf het
eerste voorbeelden in Java
Beginselen van programmeren 2 eerste voorbeelden in Java vereisten: een editor: om programma in te tikken en te bewaren een Java compiler: zet ingetikte (bron-) programma om naar byte-code een Java Virtuele
2. Syntaxis en semantiek
2. Syntaxis en semantiek In dit hoofdstuk worden de begrippen syntaxis en semantiek behandeld. Verder gaan we in op de fouten die hierin gemaakt kunnen worden en waarom dit in de algoritmiek zo desastreus
2. Syntaxis en semantiek
2. Syntaxis en semantiek In dit hoofdstuk worden de begrippen syntaxis en semantiek behandeld. Verder gaan we in op de fouten die hierin gemaakt kunnen worden en waarom dit in de algoritmiek zo desastreus
Een spoedcursus python
Een spoedcursus python Zoals je in de titel misschien al gezien hebt, geven wij een spoedcursus Python. Door deze cursus leer je alle basics, zoals het rekenen met Python en het gebruik van strings. Het
