Reguliere Expressie, How to learn

Pagina: 1
Acties:
  • 322 views sinds 30-01-2008
  • Reageer

Acties:
  • 0 Henk 'm!

  • vinnux
  • Registratie: Maart 2001
  • Niet online
Na al weer een post over reguliere expressie te hebben geplaatsts. En weer rara opmerkingen naar mijn kop krijg, omdat ik niet gezocht zou hebben, heb ik maar eens besloten om aan de heren experts te vragen :
Hoe leer je reguliere expressies?

Nou gaat het hier voornamelijk om reguliere expressies te gebruiken binnen PHP, maar java zou ook leuk zijn.
Ik neem aan dat reguliere expressies binnen PHP en Java hetzelfde zijn, of zit ik daar weer eens helemaal naast ?
Gaarne antwoord.

En ook nog een kleine opmerking aan de heren experts,
logische expressies zijn voor beginners zeer PIEP om te lezen en te begrijpen. Uit een programmeertaaal kun je nog iets wijs, maar uit een regeltje van 60 tekens wat de functionaliteit heeft van 100 regels code kom je echt niet uit. En zou jij het leuk vinden als iemand zo vel reageerd om jouw "DOMME" vragen. Maar ok hier hebben we het niet meer over.

Dus :
Wat zijn goede boeken, dictaten, die stap voor stap vanaf nul kennis uitleg geven ?
En natuurlijk tutorials.


En reken er maar op dat als ik reguliere expressies snap al die newbie vragen gewoon beantwoord met een verwijzing naar goede tutorials !

Acties:
  • 0 Henk 'm!

  • 2
  • Registratie: November 2000
  • Laatst online: 26-05-2021

2

Wat dacht je van

http://www.google.com/search?sq=regular+expressions

Er is zo ongelooflijk veel over te vinden.

Acties:
  • 0 Henk 'm!

  • vinnux
  • Registratie: Maart 2001
  • Niet online
Op dinsdag 16 april 2002 00:59 schreef 2 het volgende:
Wat dacht je van

http://www.google.com/search?sq=regular+expressions

Er is zo ongelooflijk veel over te vinden.
Ik weet dat er ongelooflijk veel te vinden is !
Maar voor een beginner weet ik toch niet wat goed te leren is en wat niet. Ik ziet door de bomen het bos niet meer.
Meer heb ik wat aan goede tutorials, zoals in mijn bericht reeds gezegt. Toch bedankt dat je meedenkt :)

Acties:
  • 0 Henk 'm!

  • Postman
  • Registratie: Februari 2000
  • Laatst online: 18-09 19:05
Op dinsdag 16 april 2002 00:58 schreef fladder het volgende:
http://www.phpbuilder.com/columns/dario19990616.php3
Vincent, deze tutorial op PHPBuilder geeft al goede uitleg. Verder zou je nog op http://php.net/pcre kunnen kijken. Staat goed gedocumenteerd en met voorbeelden. Tevens zijn de user comments daar ook vaak nuttig.
Verder zou ik je adviseren om gewoon wat te proberen. Download bijv. phpBB, daarin gebruiken ze regexp voor tag-replacement ([url, smilies, etc.). En verander daar dan dingen aan. Wil je niet proberen, maar het via theorie doen: koop dan het boek gepost door Yarvieh.

Acties:
  • 0 Henk 'm!

  • vinnux
  • Registratie: Maart 2001
  • Niet online
Op dinsdag 16 april 2002 01:31 schreef FlamerX het volgende:

[..]

Vincent, deze tutorial op PHPBuilder geeft al goede uitleg. Verder zou je nog op http://php.net/pcre kunnen kijken. Staat goed gedocumenteerd en met voorbeelden. Tevens zijn de user comments daar ook vaak nuttig.
Verder zou ik je adviseren om gewoon wat te proberen. Download bijv. phpBB, daarin gebruiken ze regexp voor tag-replacement ([url, smilies, etc.). En verander daar dan dingen aan. Wil je niet proberen, maar het via theorie doen: koop dan het boek gepost door Yarvieh.
Thanx, Hier kan ik echt wat mee. Boek is goede tutorial is simpel. Ik begin het te begrijpen.

Acties:
  • 0 Henk 'm!

Verwijderd

Grum is daar heeeeeeeeeeeel goed in :D B-)

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 01:47
GoT FAQ, How to read

Google Zoekmachine, How to search

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 01:47
En wat betreft het aan (waarschijnlijk) mij (en Grum) gerichte commentaar naar aanleiding van je post gisteren. Net als toen reageerde ik nu alleen op het feit dat je je niet aan GoT policy houdt. Stomme vragen stellen is zo af en toe best toegestaan (ik doe het zelf regelmatig, zei het niet op GoT), maar wel nadat je (onder andere) eerst hebt gecontroleerd of het antwoord op je vraag niet op Google (duizenden hits over dit onderwerp, met ook een aantal bruikbare) of in de GoT FAQ (tientallen links naar sites over programmeertalen en -principes) te vinden is.

Hou je gezeur over 'ja maar het is moeilijk' dus maar voor je. Als je je aan de regels houdt mag je hier vragen wat je wilt, maar we zijn hier niet jou mens-gefilterde zoekmachine en ook niet jou MBO-docent.

Acties:
  • 0 Henk 'm!

  • vinnux
  • Registratie: Maart 2001
  • Niet online
Op dinsdag 16 april 2002 09:22 schreef Soultaker het volgende:
En wat betreft het aan (waarschijnlijk) mij (en Grum) gerichte commentaar naar aanleiding van je post gisteren. Net als toen reageerde ik nu alleen op het feit dat je je niet aan GoT policy houdt. Stomme vragen stellen is zo af en toe best toegestaan (ik doe het zelf regelmatig, zei het niet op GoT), maar wel nadat je (onder andere) eerst hebt gecontroleerd of het antwoord op je vraag niet op Google (duizenden hits over dit onderwerp, met ook een aantal bruikbare) of in de GoT FAQ (tientallen links naar sites over programmeertalen en -principes) te vinden is.

Hou je gezeur over 'ja maar het is moeilijk' dus maar voor je. Als je je aan de regels houdt mag je hier vragen wat je wilt, maar we zijn hier niet jou mens-gefilterde zoekmachine en ook niet jou MBO-docent.
Ik ga hier maar niet verder op in, al snap ik dat je nog steeds niet begrijpt wat ik bedoel.

Acties:
  • 0 Henk 'm!

  • Grum
  • Registratie: Juni 2001
  • Niet online
vgouw: Er zit wel degelijk waarheid in het stuk van Soultaker.

90% van de posts hier zijn met 30 sec googlen en dan 2 minuten lezen op te lossen en daarbij komt je fanatiekheid en felheid in je eerste post niet zo maar uit de lucht vallen.

Voor de mensen die niet precies weten om welke post het gaat: [topic=469049]

Acties:
  • 0 Henk 'm!

  • DizzyWeb
  • Registratie: Februari 2001
  • Laatst online: 05-09 14:30

DizzyWeb

Ondertiteld

Op dinsdag 16 april 2002 09:22 schreef Soultaker het volgende:
En wat betreft het aan (waarschijnlijk) mij (en Grum) gerichte commentaar naar aanleiding van je post gisteren. Net als toen reageerde ik nu alleen op het feit dat je je niet aan GoT policy houdt. Stomme vragen stellen is zo af en toe best toegestaan (ik doe het zelf regelmatig, zei het niet op GoT), maar wel nadat je (onder andere) eerst hebt gecontroleerd of het antwoord op je vraag niet op Google (duizenden hits over dit onderwerp, met ook een aantal bruikbare) of in de GoT FAQ (tientallen links naar sites over programmeertalen en -principes) te vinden is.

Hou je gezeur over 'ja maar het is moeilijk' dus maar voor je. Als je je aan de regels houdt mag je hier vragen wat je wilt, maar we zijn hier niet jou mens-gefilterde zoekmachine en ook niet jou MBO-docent.
Ik denk dat dit geval toch net ff iets anders is.
Ik heb me ook meerdere malen voorgenomen om regexes te leren, maar ik heb ook de vele duizenden hits op google doorgespit zonder te weten wat ik nou wel moet bekijken en wat niet. De variatie in niveau over dit onderwerp is gewoon zo enorm groot dat je echt van gekkigheid niet meer weet waar je moet beginnen.

Maarja, de paar "goede" tutorials die me werden aangewezen, kwam ik ook niets mee verder, dus ik betwijfel of het voor me is weggelegd ;)
Ik snapte precies wat er stond, alle voorbeelden snapte ik, maar ik kreeg zelf de simpelste regex niet uitgewerkt :P

Acties:
  • 0 Henk 'm!

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 02-09 11:02

D2k

uhm laten we de discussie hier maar ff weglaten en proberen te helpen
de dingen die in een reqex kunnen worden gebruikt zijn overal te vinden, het probleem is begrijpelijke oefenstof denk ik
dus Grum stel gewoon 1 of 2 voorbeeld opgaven (en als er wat mensen een regex hebben gepost de oplossing posten)
of is dat een gek id?

Doet iets met Cloud (MS/IBM)


Acties:
  • 0 Henk 'm!

  • vinnux
  • Registratie: Maart 2001
  • Niet online
Op dinsdag 16 april 2002 09:39 schreef D2k het volgende:
uhm laten we de discussie hier maar ff weglaten en proberen te helpen
de dingen die in een reqex kunnen worden gebruikt zijn overal te vinden, het probleem is begrijpelijke oefenstof denk ik
dus Grum stel gewoon 1 of 2 voorbeeld opgaven (en als er wat mensen een regex hebben gepost de oplossing posten)
of is dat een gek id?
Een uitstekend id, ben ik ook zeker van plan als ik het onder de knie krijg, en het gaat aardig al moet ik zeggen.
Want het is een partij tutorials en vage toestanden hoor !.

Acties:
  • 0 Henk 'm!

  • Grum
  • Registratie: Juni 2001
  • Niet online
Humz .. een tutorial schrijven kost me eeuwen maar ik zal er inderdaad eens over nadenken.

Voor iig een 'uitgeschreven' regex:

http://gathering.tweakers.net/forum/list_message/13168275#13168275

Acties:
  • 0 Henk 'm!

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 02-09 11:02

D2k

Op dinsdag 16 april 2002 09:57 schreef Grum het volgende:
Humz .. een tutorial schrijven kost me eeuwen maar ik zal er inderdaad eens over nadenken.

Voor iig een 'uitgeschreven' regex:

http://gathering.tweakers.net/forum/list_message/13168275#13168275
een echte tut hoeft niet
als je hier gewoon wat voorbeeldjes maakt?
ik roep maar wat hoor ;) dus kijk maar wat je der mee doet :P

Doet iets met Cloud (MS/IBM)


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 01:47
Op dinsdag 16 april 2002 09:39 schreef D2k het volgende:
uhm laten we de discussie hier maar ff weglaten en proberen te helpen
de dingen die in een reqex kunnen worden gebruikt zijn overal te vinden, het probleem is begrijpelijke oefenstof denk ik
dus Grum stel gewoon 1 of 2 voorbeeld opgaven (en als er wat mensen een regex hebben gepost de oplossing posten)
of is dat een gek id?
Met enkele voorbeelden kun je POSIX-reguliere expressies wel behandelen. Perl regexps zijn VEEL complexer, dus dat ligt moeilijker. In elk geval, mogen die voorbeelden dan in de FAQ en topics die er om vragen gewoon op slot, want het is natuurlijk vervelend om elke keer hetzelfde op te moeten lepelen.

Acties:
  • 0 Henk 'm!

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 02-09 11:02

D2k

Op dinsdag 16 april 2002 10:16 schreef Soultaker het volgende:
Met enkele voorbeelden kun je POSIX-reguliere expressies wel behandelen. Perl regexps zijn VEEL complexer, dus dat ligt moeilijker. In elk geval, mogen die voorbeelden dan in de FAQ en topics die er om vragen gewoon op slot, want het is natuurlijk vervelend om elke keer hetzelfde op te moeten lepelen.
als er duidelijke voorbeelden met uitwerkingen (zoals die Regex van Grum bij die link die ie net postte) zal ik die ook in de faq opnemen zodat we er naar kunnen verwijzen.
(die van Grum heb ik al gesaved iig voor later (her)gebruik)

Doet iets met Cloud (MS/IBM)


Acties:
  • 0 Henk 'm!

  • vinnux
  • Registratie: Maart 2001
  • Niet online
Op dinsdag 16 april 2002 10:17 schreef D2k het volgende:

[..]

als er duidelijke voorbeelden met uitwerkingen (zoals die Regex van Grum bij die link die ie net postte) zal ik die ook in de faq opnemen zodat we er naar kunnen verwijzen.
(die van Grum heb ik al gesaved iig voor later (her)gebruik)
Ik zal straks als de klasse af is van topic [topic=469328/1/50] in zijn geheel af is het posten met uitleg over de regexen die er in zitten.

Acties:
  • 0 Henk 'm!

Verwijderd

/me gaat even kloppen

Vraag vooraf: waar moet het over gaan? Wat vindt "men" moeilijk? :?

Acties:
  • 0 Henk 'm!

  • vinnux
  • Registratie: Maart 2001
  • Niet online
Op dinsdag 16 april 2002 10:36 schreef Arien het volgende:
/me gaat even kloppen

Vraag vooraf: waar moet het over gaan? Wat vindt "men" moeilijk? :?
Nou wat vond ik moeilijk :
De syntax
- Groeperen met ( gebruik van | [kkk]
Speciale tekens
- $ ^ d s etc
- {}

Maar dat is mijn ervaring tot nu toe he.

Een lijstje met speciale tekes zou erg handig zijn.

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

vgouw: Een lijstje met speciale tekes zou erg handig zijn.
Al doorgelezen?

Believe you me, als je dat goed doorgewerkt heb, heb zoveel vragen niet meer. Kost alleen net even wat meer tijd dan dat wij het voorkauwen, maar je hebt er (naar schatting) 50x zoveel aan.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

Verwijderd

Wat zijn reguliere expressies?

Reguliere expressies zijn een manier om een (abstracte) taal te omschrijven. Je kunt zo aangeven welke woorden syntactisch correct zijn (en dus ook welke woorden dat niet zijn). Is het eerste dat in je opkomt nu " :? ", vergeet dit dan. De onderstaande omschrijving voldoet prima.

Reguliere expressies zijn een manier om strings te omschrijven. Hoe je een bepaalde regex schrijft hangt af van de taal of tool die je gebruikt, kijk dus in de docs. Ik gebruik in het vervolg Perl als voorbeeld.

Een voorbeeld

Laten we eenvoudig beginnen en eerst een kijken hoe zo'n regex er dan in het wild uitziet.
Stel, je wilt uit een bestand (waarin op elke regel een woord staat) de woorden halen waar een "a" in zit. Een stukje van de code zou zo kunnen zijn in Perl:
code:
1
2
3
while (<FILE>) {   # lees woord in
    print if /a/;  # print als er een "a" in zit
}

Wat er hier gebeurt is dat iedere keer een regel uit het bestand gelezen wordt (en de inhoud van die regel automagisch in de variabele $_ gekopieerd wordt). Vervolgens wordt gekeken of de regel (dwz de waarde van de magische $_ variabele) voldoet aan de regex /a/, en als dat zo is wordt de regel (dwz de waarde van de magische $_ variabele, die zo magisch is dat je hem niet eens ziet) geprint.

Zoals je ziet matcht de "a" in de regex /a/ zichzelf. Dit geldt voor de meeste tekens.

Hoe zou je kunnen kijken welke woorden "aa" (dus een "a" gevolgd door nog een "a") bevatten? Denk eerst even na...

Inderdaad, met de regex /aa/. Het achter elkaar zetten van tekens in een regex heeft tot gevolg dat de tekens in volgorde gematcht moeten worden.

Nou zei ik boven dat de meeste tekens zichzelf matchen, maar wat doen die andere tekens dan? Die andere tekens (metacharacters) zorgen ervoor dat er iets speciaals gebeurt, ze geven bijvoorbeeld een keuze of een herhaling aan.

Als een teken speciaal is kunt je het zo speciaal maken dat het weer normaal wordt (dus: zichzelf matcht) door er een backslash voor te zetten. Op dezelfde manier kun je een normaal teken speciaal maken (zie hieronder).

Keuzes

Wat nu als je wilt kijken of een regel "aa" of "ee" bevat? Voor keuzes kun je het pipe symbool op de volgende manier gebruiken:
code:
1
2
/aa|ee/  # match "aa" OF "ee" in een string
/aa\|ee/ # match "aa|ee" (letterlijk!) in een string

Herhaling

Om aan te geven dat een bepaald teken een aantal keer herhaald moet/mag worden kun je de volgende constructies gebruiken:
code:
1
2
3
4
5
/a*/    # match 0 of meer keer "a"
/a+/    # match 1 of meer keer "a"
/a{1,2} # macth 1 of twee keer "a"
/a{1,}  # match 1 of meer keer "a"
/a{2}/  # match precies 2 keer "a"

Uit zichzelf zal de regex engine proberen zo vaak mogelijk te matchen als het de keuze krijgt tussen minder of meer matchen op dezelfde plek. Dus (match in vierkante haken):
code:
1
/a+/  # matcht b[aaa]bbaaaaaa

Je ziet dat /a+/ zo vaak mogelijk een "a" match. Of is dat niet zo? Verder naar recht staan meer "a"s dan hij er nu pakt! :o
Het belangrijke punt om te onthouden is dat een regex van links naar rechts werkt en houdt van "instant gratification" (als hij nu kan zorgen voor een complete match, waarom dan nog verder gaan? maar ook: als hij nu veel kan pakken in plaats van weinig, waarom dan met weinig tevreden zijn?). Lees het stukje hierboven nog eens en let op het vetgedrukte "op dezelfde plek".

Acties:
  • 0 Henk 'm!

Verwijderd

Grouping

Om stukken van een regex te groeperen gebruik je haakjes, bijvoorbeeld:
code:
1
2
3
4
5
/aa|bb/    # matcht "aa" of "bb"
/a(a|b)b/  # matcht "aab" of "abb"

/ab{2}/    # matcht "abb"
/(ab){2}/  # matcht "abab"

Assertions

Soms wil je niet een bepaald teken matchen, maar wil je alleen kijken of iets waar is of niet.

Om aan te geven waar je wilt dat de match moet zijn kan je anchors gebruiken:
code:
1
2
/^a/  # begint met a
/a$/  # eindigt met a

De ^ zorgt er dus voor dat de match alleen slaagt als ^ kan matchen aan het begin van de string. ^ neemt geen ruimte in! (Idem voor $).

Ook kan je kijken of je op de grends van een "woord" bent (een "woord" bestaat in Perl uit letters, cijfer en de underscore, tenzij je met Unicode bezig bent) of juist niet:
code:
1
2
/\ber\b/  # "er" als los woord
/\Ber\b/  # "er" aan het einde van een woord

Character classes

Zag je net hoeveel tekst ik nodig had om te omschrijven welke dingen in Perl een "woord" zijn? Dat moet toch handiger kunnen? Je zou bijna denken dat dat met een regex kan. Dat kan dus ook. 8-)
code:
1
/^[a-zA-Z0-9_]+$/  # dit vindt Perl een "woord"

De vierkante haken geven een character class aan, dwz een omschrijving van de verzameling tekens die op een bepaalde plek mogen voorkomen. Waarom moet ik dan toch een "+" toevoegen om meerdere tekens uit de character class te matchen?

Acties:
  • 0 Henk 'm!

Verwijderd

Lijkt dit ergens op of mag ik het verbranden? Opmerkingen zijn welkom. :)

Acties:
  • 0 Henk 'm!

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 02-09 11:02

D2k

Op dinsdag 16 april 2002 14:44 schreef Arien het volgende:
Lijkt dit ergens op of mag ik het verbranden? Opmerkingen zijn welkom. :)
:*
geweldig Arien
ik ga dit vanavond/morgen in de faq opnemen

Doet iets met Cloud (MS/IBM)


Acties:
  • 0 Henk 'm!

Verwijderd

D2k: :*
geweldig Arien
ik ga dit vanavond/morgen in de faq opnemen
:o Het was nog maar het begin... :D

Denk dat het eigenlijk zo wel goed is als opstapje naar bijvoorbeeld PerlReTut en PerlRe voor details of PHP's PCRE.

Acties:
  • 0 Henk 'm!

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 02-09 11:02

D2k

Op dinsdag 16 april 2002 14:55 schreef Arien het volgende:


:o Het was nog maar het begin... :D
dan wacht ik met spanning op de rest :+
Denk dat het eigenlijk zo wel goed is als opstapje naar bijvoorbeeld PerlReTut en PerlRe voor details of PHP's PCRE.
die linkjes zal ik er dan ook wel ff bijzetten

Doet iets met Cloud (MS/IBM)


Acties:
  • 0 Henk 'm!

  • tomato
  • Registratie: November 1999
  • Niet online
En nu nooit meer regex vraagjes hier? ;(

Of alleen nog interessante regex vragen voortaan :)

Ik zal nog even Arien's verhaaltje doorlezen, maar ik verwacht niet dat ik er een grove fout in zal vinden ;)

Acties:
  • 0 Henk 'm!

  • djc
  • Registratie: December 2001
  • Laatst online: 08-09 23:18

djc

http://zez.org/article/articleprint/11/ (uit de post van Glimi, maar dan op een pagina) is ook wel heeeel erg duidelijk, met veel voorbeeldjes enzo.

Rustacean


Acties:
  • 0 Henk 'm!

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 02-09 11:02

D2k

Op dinsdag 16 april 2002 15:14 schreef Manuzhai het volgende:
http://zez.org/article/articleprint/11/ (uit de post van Glimi, maar dan op een pagina) is ook wel heeeel erg duidelijk, met veel voorbeeldjes enzo.
*noteert voor FAQ*

Doet iets met Cloud (MS/IBM)


Acties:
  • 0 Henk 'm!

  • tomato
  • Registratie: November 1999
  • Niet online
Arien: Als een teken speciaal is kunt je het zo speciaal maken dat het weer normaal wordt (dus: zichzelf matcht) door er een backslash voor te zetten. Op dezelfde manier kun je een normaal teken speciaal maken (zie hieronder).
Euh... die laatste begrijp ik niet :?

Verder alles ok ;)
Ik denk alleen dat iedereen die alleen dit stukje leest het idee van character classes niet goed zal begrijpen (maar je moet ook niet alleen dit stukje lezen >:)).

[edit]
tomato: Euh... die laatste begrijp ik niet :?
Ojah, daar bedoelde je natuurlijk de \b etcetera mee :z

Acties:
  • 0 Henk 'm!

  • brammetje
  • Registratie: Oktober 2000
  • Laatst online: 12-01 11:31
Op dinsdag 16 april 2002 14:44 schreef Arien het volgende:
Lijkt dit ergens op of mag ik het verbranden? Opmerkingen zijn welkom. :)
Ziet er leuk uit.. Bij sommige voorbeelden is het wel handig om te zien waar hij _niet_ op matcht..

Acties:
  • 0 Henk 'm!

  • kaandorp
  • Registratie: November 1999
  • Laatst online: 10-09 11:45
DEVSHED! (www.devshed.com)

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

* ACM ziet hier en daar een klein typefoutje in Arien's (verder erg leesbare en goede) regexp intro :)
Als een teken speciaal is kunt je het zo
Voor keuzes kun je het pipe symbool (de | ) op de volgende manier gebruiken:
Volgens mij is de term "pipe-symbool" niet zo vreselijk bekend bij "non-unix users" :)
/a*/ # matcht 0 of meer keer "a" (bijv: '', 'a', 'aaaaaaa')
/a+/ # matcht 1 of meer keer "a" (bijv: 'a', 'aaaaa')
/a{3,5} # matcht drie tot vijf keer "a" (bijv: 'aaaa')
/a{2,} # matcht twee of meer keer "a" (bijv: 'aaaaa')
/a{2}/ # matcht precies 2 keer "a" ('aa' dus)
Ik denk dat ze zo ietsje duidelijker geformuleerd zijn :)

<hr>
Op dinsdag 16 april 2002 14:41 schreef Arien het volgende:
/aa|bb/ # matcht "aa" of "bb"
/a(a|b)b/ # matcht "aab" of "abb"
/a(abc|cba)b/ # matcht "aabcb" of "acbab"
/ab{2}/ # matcht "abb"
/(ab){2}/ # matcht "abab"
Extra voorbeeld die de variabele lengte wat beter uitdrukt ?
De ^ zorgt er dus voor dat de match alleen slaagt ("gematched wordt") als ^ kan matchen aan het begin van de string. ^ neemt geen ruimte in! (Idem voor $).
Ook kan je kijken of je op de grends van
/\ber\b/ # "er" als los woord (bijv: "Het gaat er goed")
/\Ber\b/ # "er" aan het einde van een woord (bijv: "Achter de molen")
Op dinsdag 16 april 2002 14:44 schreef Arien het volgende:
Lijkt dit ergens op of mag ik het verbranden? Opmerkingen zijn welkom. :)
Het lijkt zeker ergens op :)

Nu wil ik uiteraard opmerkingen over mijn opmerkingen ;)

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Tja wat is eigenlijk de nl. benaming voor een '|' character...

* drm zoekt ff

edit:
Van Dale
`pipe·line (de ~ (m.))

1 het typografische teken |

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • brammetje
  • Registratie: Oktober 2000
  • Laatst online: 12-01 11:31
Op dinsdag 16 april 2002 16:44 schreef drm het volgende:
Tja wat is eigenlijk de nl. benaming voor een '|' character...

* drm zoekt ff
pijpje? :+

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

pijpsymbool?

en nee dan bedoel ik niet die beweging dat je met je hand voor je mond heen en weer gaat en met je tong steeds zo'n bubbel in je wang duwt :+

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
:) Weer wat geleerd vandaag -> Bedankt Arien!

Acties:
  • 0 Henk 'm!

  • Rense Klinkenberg
  • Registratie: November 2000
  • Laatst online: 03-09 14:12
En voor de luie php'ers onder ons die de stap van perl naar php niet goed lukt nog een tutorial ;)

Acties:
  • 0 Henk 'm!

Verwijderd

/me zal zo even reageren op de mensen die gereageerd hebben zodat die kunnen reageren.

<rant>
Wat me net opviel toen ik door de link freak007 heen las is hoe raar PCRE in PHP geintegreerd zijn (of beter: niet geintegreerd zijn).

Waarom moet ik in een (PCRE) regex in PHP de delimiters aangeven als de regex al binnen quotes staat? |:(

En als ik dan toch de delimiters moet aangeven (en zelfs mag kiezen welke ik wil geruiken), waarom dan niet zorgen dat regexen geschreven kunnen worden met delimiters als delimiters en zonder quotes (behalve natuurlijk als ik quotes wil gebruiken als delimiters)?

Raar idee? Zover van de here-doc syntax (die PHP via Perl uit de shell gecopy-paste heeft) is het niet af. En het zou werken met regexen in PHP een stukje aangenamer maken.
</rant>

Acties:
  • 0 Henk 'm!

  • djc
  • Registratie: December 2001
  • Laatst online: 08-09 23:18

djc

Op woensdag 17 april 2002 01:24 schreef Arien het volgende:
Waarom moet ik in een (PCRE) regex in PHP de delimiters aangeven als de regex al binnen quotes staat? |:
Omdat modifier dingetjes als i buiten de delimiters, maar binnen de quotes moeten?

Rustacean


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Op woensdag 17 april 2002 01:24 schreef Arien wat commentaar over pcre
Das denk ik grotendeels gerelateerd aan het feit dat pcre een aparte module is, die gelinked wordt binnen php. Oftewel er moet "op een of andere manier" een reeks tekens aan gegeven worden. Aangezien het een c-lib is zal dat dmv een char-array (oftewel "string") moeten gebeuren. Dat je dan toevallig daarin ook nog es een compleet geldige regexp moet opgeven is wat minder relevant dan.

Het is echter wel vreselijk jammer, want, zoals je al zegt, het werken met regexpen (dubbel escapen van tekens bijv) wordt er niet duidelijker op. Of ze er ooit aan zullen beginnen om er een complete taal-constructie van te maken betwijfel ik, echt netjes programmeren is het ook weer niet :)
Op woensdag 17 april 2002 01:44 schreef Manuzhai het volgende:
Omdat modifier dingetjes als i buiten de delimiters, maar binnen de quotes moeten?
Het probleem is ietsje dieper te zoeken :)
Namelijk dat regexp gewoon "een onderdeel van de perl-taal" is en bij php helemaal niet, maar een aparte "c"-module.

Acties:
  • 0 Henk 'm!

  • tomato
  • Registratie: November 1999
  • Niet online
Arien: Wat me net opviel toen ik door de link freak007 heen las is hoe raar PCRE in PHP geintegreerd zijn (of beter: niet geintegreerd zijn).
Tsja, maar dat was mij (en jou) al wel eerder opgevallen ;)
[here-doc syntax in PHP]
Die is sowieso $%#@#% geimplementeerd trouwens en opvallend weinig bekend onder PHP-ers...
ACM: Das denk ik grotendeels gerelateerd aan het feit dat pcre een aparte module is, die gelinked wordt binnen php. Oftewel er moet "op een of andere manier" een reeks tekens aan gegeven worden. Aangezien het een c-lib is zal dat dmv een char-array (oftewel "string") moeten gebeuren. Dat je dan toevallig daarin ook nog es een compleet geldige regexp moet opgeven is wat minder relevant dan.
Mwah, daar ligt volgens mij het probleem helemaal niet. De PCRE-lib zit namelijk niet zo slecht in elkaar als je hier doet voorkomen.

PCRE verwacht als pattern gewoon een C string (null-terminated) inderdaad, maar deze bevat alleen het pattern, niet de eventuele modifiers (deze worden als apart argument doorgegeven). Dat PHP nou zelf dit alles aan elkaar geplakt wil krijgen (delimiters, pattern, modifiers) in een string om het vervolgens weer uit elkaar te trekken om door te kunnen geven aan PCRE is iets wat ik niet echt voor de hand vind liggen.
Neem het dan of als volwaardig language construct op (dus bijvoorbeeld /pattern/modifiers en niet in een string), of verwacht een string met het pattern en implementeer de modifiers bijvoorbeeld als flags ofzo :Z

Acties:
  • 0 Henk 'm!

  • tomato
  • Registratie: November 1999
  • Niet online
ACM: Het probleem is ietsje dieper te zoeken :)
Namelijk dat regexp gewoon "een onderdeel van de perl-taal" is en bij php helemaal niet, maar een aparte "c"-module.
Wanneer het een echt taalonderdeel zou worden kan PHP nog prima de PCRE lib als regex engine gebruiken.

Dat regexen een volwaardig taalonderdeel zijn in perl wil niet zeggen dat de regex engine als spaghetti door heel de perl source loopt. Ik neem aan dat de regex engine in Perl net zoals PCRE een 'losstaand' onderdeel is en ik meen mij te herinneren dat er ook Perl implementaties zijn met andere regexengines (en dan bedoel ik niet Larry's perl 1.0 etc ;)).

Acties:
  • 0 Henk 'm!

Verwijderd

Manuzhai: Omdat modifier dingetjes als i buiten de delimiters, maar binnen de quotes moeten?
De typische PHP oplossing zou zijn om dat met constanten op te lossen (PCRE_MULTI_LINE bv) en die als argumenten mee te geven aan de functies (zie voor het zelfde idee bijvoorbeeld mysql_fetch_array).

Nu hebben ze de Perl syntax slecht gekopieerd.

Acties:
  • 0 Henk 'm!

Verwijderd

ACM: Das denk ik grotendeels gerelateerd aan het feit dat pcre een aparte module is, die gelinked wordt binnen php.
Precies. Maar desondanks hadden ze er voor kunnen kiezen om support voor regexen dieper te integereren in de taal ipv het eraan vast te plakken.

En ook al hadden ze dat niet gedaan dan hadden ze er voor kunnen kiezen om als enige delimiters de single en double quotes (dus de string is de regex en de quotes van de string geven begin en einde van de string en dus van de regex aan) toe te staan en modifiers als extra paramter(s) met de functie mee te geven. Of regex objecten kunnen maken. Of... Mogelijkheden genoeg, waarvan de gekozen IMHO nou niet de allermooiste was en dat is wel jammer.

Acties:
  • 0 Henk 'm!

Verwijderd

tomato: Tsja, maar dat was mij (en jou) al wel eerder opgevallen ;)
Het viel me nu (na dagenlang Perl en beter naar regexen te kijken dan normaal) weer op... ;)
Die is sowieso $%#@#% geimplementeerd trouwens en opvallend weinig bekend onder PHP-ers...
Laat ik hier maar niets over zeggen, anders lijkt het net alsof ik een hekel aan PHP heb ofzo. :P
PCRE verwacht als pattern gewoon een C string (null-terminated) inderdaad.
Vraag me trouwens af of PHP op zijn bek zou gaan bij een regex met een NULL erin of matchen op een string met een NULL erin. >:)

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Arien>
Ik begrijp eerlijk gezegd echt niet waar je je druk om maakt.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

Verwijderd

/me was al weer vergeten waarom hij dit draadje open trok |:(
tomato: Ik denk alleen dat iedereen die alleen dit stukje leest het idee van character classes niet goed zal begrijpen (maar je moet ook niet alleen dit stukje lezen >:)).
Is niet het beste gedeelte van de uitleg nee. :D Misschien zoiets?
Als kortere notatie voor keuzes tussen karakters kun je character classes gebruiken. Bijvoorbeeld om een teken te mathcen dat een "a", een "b" of een "c" kan zijn kan beide onderstaande contrcuties gebruiken:
code:
1
2
3
/a|b|c/  # alternatie: de normale "keuze"
/[abc]/  # character class van letters "a", "b" en "c"
/[a-c]/  # idem van de range van "a" tot en met "c"

Een character class is een opsomming van tekens, en binnen de character class (dus tussen de begin [ en de eind ] verliezen metacharacters als |, (, ), en . (waar ik het zo over heb) hun speciale betekenis.
code:
1
/[|(){}]/  # match het pipe symbool of een van de haken

Om binnen een character class een "-" te gebruiken kan je hem aan het begin (direct na de openingshaak), aan het einde van de class zetten of escapen:
code:
1
2
3
/[ac-z-]/  # match een kleine letter behalve b, of de min
/[-ac-z]/  # idem
/[a\-c-z]/ # idem

Kijk eens of je in de docs van jouw taal of tool kunt vinden hoe je een letterlijke "[" of "]" in een character class op kunt nemen.

Acties:
  • 0 Henk 'm!

Verwijderd

drm: Ik begrijp eerlijk gezegd echt niet waar je je druk om maakt.
Ik maak me niet zo snel druk hoor. :+

(Wat bedoel je?)

Nice .sig :)

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Arien:
Is niet het beste gedeelte van de uitleg nee. :D Misschien zoiets?
[classes]
Ik vind 'm mooi. Maar then again, kan je dat beter aan iemand vragen die het niet al "kent".

edit:
Arien:
Ik maak me niet zo snel druk hoor. :+

(Wat bedoel je?)
regexen als strings in PHP. 't Valt beter binnen de grammatica van de taal, dus waarom niet?
Nice .sig :)
;)

edit2: post.revise ();

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

Verwijderd

brammetje: Ziet er leuk uit.. Bij sommige voorbeelden is het wel handig om te zien waar hij _niet_ op matcht..
De rest. (Voor bepaalde waarden van "rest".) :+

Is misschien wel een goed idee om erbij te zetten, maar ga ik niet meer doen. ;)
ACM: Volgens mij is de term "pipe-symbool" niet zo vreselijk bekend bij "non-unix users" :)
Dat is dus een extraatje voor non-Unixers die het lezen. :+
Ik denk dat ze zo ietsje duidelijker geformuleerd zijn :)
Eens en oneens. Het voordeel van die toevoeging is duidelijk. Het nadeel is dat mensen al snel denken dat /a+/ "sinterklaas" matcht, terwijl het alleen het volgende gedeelte van sinterklaas matcht: sinterklaas. Vandaar die omschrijvingen.
Extra voorbeeld die de variabele lengte wat beter uitdrukt?
Zoiets als dit?
code:
1
/a{2,4}/  # matcht "aa", "aaa" of "aaaa"
Nu wil ik uiteraard opmerkingen over mijn opmerkingen ;)
Dank voor je opbouwende kritiek. :)

Dan was ik nog een van de meest gebruikte metachracters vergeten, en wel de punt (afbeelding --> . ).
Normaal matcht de punt elk teken behalve de newline. (Dit heeft te maken met de geschiedenis van regexen in tools zoals grep die op regelbasis werken.) De punt is dus een soort van super-character class.

Wil je een letterlijke punt matchen dan moet je...? Je raadt het al: je moet er een backslash voor zetten.

En na dit hele verhaal: zie je docs voor meer info. :Y)

Acties:
  • 0 Henk 'm!

Verwijderd

drm: Ik vind 'm mooi. Maar then again, kan je dat beter aan iemand vragen die het niet al "kent".
Dank je. :) Het rare is dat die iemanden zich nu niet laten horen. :?
Regexen als strings in PHP. 't Valt beter binnen de grammatica van de taal, dus waarom niet?
Het punt is dat het nu niet mooi in de taal verwerkt is. (Daar kan je over twisten natuurlijk. Mijn redenen voor die uitspraak staan hierboven.)

Acties:
  • 0 Henk 'm!

  • tomato
  • Registratie: November 1999
  • Niet online
Arien, je bent te goed voor ons ;)

Als bonus noem ik dan nog maar even de ? quantifier welke de voorgaande groep 1 of 0 keer laat gelden:
code:
1
/ab?a/   # matcht 'aa' en 'aba'

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Arien:
Dank je. :) Het rare is dat die iemanden zich nu niet laten horen. :?
Auto-didacten staan kennelijk alleen maar vroeg op. De rest niet.
Het punt is dat het nu niet mooi in de taal verwerkt is. (Daar kan je over twisten natuurlijk. Mijn redenen voor die uitspraak staan hierboven.)
Ik snap opzich de redenen voor die uitspraak wel, maar ik begrijp niet zo goed hoe het toch komt dat je je daar zo aan stoort ;)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

Verwijderd

drm: Auto-didacten staan kennelijk alleen maar vroeg op. De rest niet.
Ik ben laat wakker :P
Ik snap opzich de redenen voor die uitspraak wel, maar ik begrijp niet zo goed hoe het toch komt dat je je daar zo aan stoort ;)
Ik hou van talen die mooi in elkaar zitten en dit is niet mooi.

("En Perl dan? >:)", hoor ik grinnikend vragen daar in de hoek. Ja, ook Perl zit mooi in elkaar. Dat Perl lelijk kan zijn wil niet zeggen dat het niet schitterend kan zijn. En verder: beauty is in the eye of the beholder. ;)

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Arien:
Ik ben laat wakker :P
"vroeg" is ook in the eye of the beholder, i guess :D
Ik hou van talen die mooi in elkaar zitten en dit is niet mooi.
Tja, mooi, niet mooi... Bij Perl spelen regexen ook een grotere rol dan in PHP, dus ik vind het ook niet zo gek dat het daar een ander plaatsje krijgt. In PHP is het een onderdeel wat ondergebracht wordt in function-vorm, dus dan lijkt het mij niet meer dan logisch dat een regex een string is...
("En Perl dan? >:)", hoor ik grinnikend vragen daar in de hoek. Ja, ook Perl zit mooi in elkaar. Dat Perl lelijk kan zijn wil niet zeggen dat het niet schitterend kan zijn. En verder: beauty is in the eye of the beholder. ;)
Ik vind Perl.... "anders" :D

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • Nielsz
  • Registratie: Maart 2001
  • Niet online
Offtopic, maar toch ontopic:


Ik heb een string: "12345" (1[.b]2[./b]3[.b]4[./b]5
)
En nu wil ik twee arrays krijgen, eentje met {1,3,5} en eentje met {2,4}
De eerste is makkelijk:
preg_match_all("/\\[B\](.*?)\\[\/B\]/is",$text,$match)
Maar hoe krijg ik nu een array met waardes die er niet in zitten :?

Acties:
  • 0 Henk 'm!

Verwijderd

Nielsz: Ik heb een string
code:
1
1[b]2[/b]3[b]4[/b]5

En nu wil ik twee arrays krijgen, eentje met {1,3,5} en eentje met {2,4}
Negative lookahead en negative lookbehind. :)

Acties:
  • 0 Henk 'm!

  • Nielsz
  • Registratie: Maart 2001
  • Niet online
Op woensdag 17 april 2002 11:00 schreef Arien het volgende:

[..]

Negative lookahead en negative lookbehind. :)
Complete wartaal :)
Ff gezocht op de msdn:
(?=pattern) A subexpression that performs a positive lookahead search, which matches the string at any point where a string matching pattern begins. This is a non-capturing match, that is, the match is not captured for possible later use. For example 'Windows (?=95|98|NT|2000)' matches "Windows" in "Windows 2000" but not "Windows" in "Windows 3.1". Lookaheads do not consume characters, that is, after a match occurs, the search for the next match begins immediately following the last match, not after the characters that comprised the lookahead.

(?!pattern)
A subexpression that performs a negative lookahead search, which matches the search string at any point where a string not matching pattern begins. This is a non-capturing match, that is, the match is not captured for possible later use. For example 'Windows (?!95|98|NT|2000)' matches "Windows" in "Windows 3.1" but does not match "Windows" in "Windows 2000". Lookaheads do not consume characters, that is, after a match occurs, the search for the next match begins immediately following the last match, not after the characters that comprised the lookahead.
Maar dat houdt dus in dat ik de regexp moet veranderen, en ook 2 regexps moet maken. (of ik moet natuurlijk met een regexp de regexp vervangen ;) ) De bedoeling is dat ik 'm met echt deze regexp kan doen, dus met een /N (not) oid.
Dat is geen mogelijkheid?
(ik weet dat er in php 4.20 een preg_grep komt met een flag die het wel kan, dus ik wacht nu daarop)

Acties:
  • 0 Henk 'm!

  • tomato
  • Registratie: November 1999
  • Niet online
Waarom niet
code:
1
@matches = split /\\[b\].*?\\[\/b\]/;

oid?

Split idea by Arien ;)

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Op woensdag 17 april 2002 09:30 schreef Arien het volgende:
Eens en oneens. Het voordeel van die toevoeging is duidelijk. Het nadeel is dat mensen al snel denken dat /a+/ "sinterklaas" matcht, terwijl het alleen het volgende gedeelte van sinterklaas matcht: sinterklaas. Vandaar die omschrijvingen.
*kuch*
Als ze willen weten hoe het precies matched moeten ze zich er maar echt erin verdiepen ;)
Of een editor als komodo zien te versieren. Die heeft een hele leuke (python-like) regexp module/editor erin die je precies laat zien (dmv kleurtjes en veranderende kleur-aangaves dmv mouse-overs/selectie van bepaalde delen van de regexp) welk deel van de regexp welk deel van de inputstring matched.

Acties:
  • 0 Henk 'm!

  • Nielsz
  • Registratie: Maart 2001
  • Niet online
Op woensdag 17 april 2002 11:34 schreef tomato het volgende:
Waarom niet
code:
1
@matches = split /\\[b\].*?\\[\/b\]/;

oid?

Split idea by Arien ;)
Waarom ben ik al 3 weken bezig met testen en proberen van alle preg_functies (dus ook de split) die er maar zijn en hulp vragen aan alle l33t personen die het ook niet wisten en heb ik het nu al werken :?

* Nielsz buigt voor tomato en Arien :*

Op naar het volgende probleem uitdaging :)

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Op woensdag 17 april 2002 12:06 schreef Nielsz het volgende:
hulp vragen aan alle l33t personen die het ook niet wisten en heb ik het nu al werken :?
Moet je je probleem maar beter uitleggen :+
Ideaal om daar alle 'niet goed genoege antwoorden' op te schuiven ;-)

Acties:
  • 0 Henk 'm!

  • Nielsz
  • Registratie: Maart 2001
  • Niet online
Op woensdag 17 april 2002 12:09 schreef ACM het volgende:

[..]

Moet je je probleem maar beter uitleggen :+
Ideaal om daar alle 'niet goed genoege antwoorden' op te schuiven ;-)
:) volgens mij heb ik het precies hetzelfde uitgelegd :)

ik had jou deze keer ook maar onder de l33t personen gerekend ;)

Acties:
  • 0 Henk 'm!

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 02-09 11:02

D2k

*kick*
ff een vraag aan Arien/ACM/Grum/Tomato is dit een beetje goed verwerkt zo?
als jullie akkoord zijn kan het in de faq
<hr>
<html><head></head><body>
Wat zijn reguliere expressies?
Reguliere expressies zijn een manier om een (abstracte) taal te omschrijven. Je kunt zo aangeven welke woorden syntactisch correct zijn (en dus ook welke woorden dat niet zijn). Is het eerste dat in je opkomt nu " :? ", vergeet dit dan. De onderstaande omschrijving voldoet prima.
Reguliere expressies zijn een manier om strings te omschrijven. Hoe je een bepaalde regex schrijft hangt af van de taal of tool die je gebruikt, kijk dus in de docs. Ik gebruik in het vervolg Perl als voorbeeld.

Een voorbeeld

Laten we eenvoudig beginnen en eerst een kijken hoe zo'n regex er dan in het wild uitziet.
Stel, je wilt uit een bestand (waarin op elke regel een woord staat) de woorden halen waar een "a" in zit. Een stukje van de code zou zo kunnen zijn in Perl:
code:
1
2
3
while (<FILE>) {   # lees woord in
    print if /a/;  # print als er een "a" in zit
}


Wat er hier gebeurt is dat iedere keer een regel uit het bestand gelezen wordt (en de inhoud van die regel automagisch in de variabele $_ gekopieerd wordt). Vervolgens wordt gekeken of de regel (dwz de waarde van de magische $_ variabele) voldoet aan de regex /a/, en als dat zo is wordt de regel (dwz de waarde van de magische $_ variabele, die zo magisch is dat je hem niet eens ziet) geprint.

Zoals je ziet matcht de "a" in de regex /a/ zichzelf. Dit geldt voor de meeste tekens.
Hoe zou je kunnen kijken welke woorden "aa" (dus een "a" gevolgd door nog een "a") bevatten? Denk eerst even na...


Inderdaad, met de regex /aa/. Het achter elkaar zetten van tekens in een regex heeft tot gevolg dat de tekens in volgorde gematcht moeten worden.

Nou zei ik boven dat de meeste tekens zichzelf matchen, maar wat doen die andere tekens dan? Die andere tekens (metacharacters) zorgen ervoor dat er iets speciaals gebeurt, ze geven bijvoorbeeld een keuze of een herhaling aan.
Als een teken speciaal is kun je het zo speciaal maken dat het weer normaal wordt (dus: zichzelf matcht) door er een backslash voor te zetten. Op dezelfde manier kun je een normaal teken speciaal maken (zie hieronder).

Keuzes

Wat nu als je wilt kijken of een regel "aa" of "ee" bevat? Voor keuzes kun je het pipe symbool op de volgende manier gebruiken:

code:
1
2
/aa|ee/  # match "aa" OF "ee" in een string
/aa\|ee/ # match "aa|ee" (letterlijk!) in een string



Herhaling

Om aan te geven dat een bepaald teken een aantal keer herhaald moet/mag worden kun je de volgende constructies gebruiken:

code:
1
2
3
4
5
6
7
8
9
10
/a*/    # match 0 of meer keer "a"
/a+/    # match 1 of meer keer "a"
/a{1,2} # macth 1 of twee keer "a"
/a{1,}  # match 1 of meer keer "a"
/a{2}/  # match precies 2 keer "a"
/a*/ # matcht 0 of meer keer "a" (bijv: '', 'a', 'aaaaaaa')
/a+/ # matcht 1 of meer keer "a" (bijv: 'a', 'aaaaa')
/a{3,5} # matcht drie tot vijf keer "a" (bijv: 'aaaa')
/a{2,} # matcht twee of meer keer "a" (bijv: 'aaaaa')
/a{2}/ # matcht precies 2 keer "a" ('aa' dus)


Uit zichzelf zal de regex engine proberen zo vaak mogelijk te matchen als het de keuze krijgt tussen minder of meer matchen op dezelfde plek. Dus (match in vierkante haken):
code:
1
/a+/  # matcht b[aaa]bbaaaaaa

Je ziet dat /a+/ zo vaak mogelijk een "a" match. Of is dat niet zo? Verder naar recht staan meer "a"s dan hij er nu pakt! :o
Het belangrijke punt om te onthouden is dat een regex van links naar rechts werkt en houdt van "instant gratification" (als hij nu kan zorgen voor een complete match, waarom dan nog verder gaan? maar ook: als hij nu veel kan pakken in plaats van weinig, waarom dan met weinig tevreden zijn?). Lees het stukje hierboven nog eens en let op het vetgedrukte "op dezelfde plek".


Grouping

Om stukken van een regex te groeperen gebruik je haakjes, bijvoorbeeld:

code:
1
2
3
4
5
/aa|bb/    # matcht "aa" of "bb"
/a(a|b)b/  # matcht "aab" of "abb"
/ab{2}/    # matcht "abb"
/(ab){2}/  # matcht "abab"
/ab?a/   # matcht 'aa' en 'aba'


Assertions

Soms wil je niet een bepaald teken matchen, maar wil je alleen kijken of iets waar is of niet.
Om aan te geven waar je wilt dat de match moet zijn kan je anchors gebruiken:

code:
1
2
/^a/  # begint met a
/a$/  # eindigt met a


De ^ zorgt er dus voor dat de match alleen slaagt als ^ kan matchen aan het begin van de string. ^ neemt geen ruimte in! (Idem voor $).
Ook kan je kijken of je op de grens van een "woord" bent (een "woord" bestaat in Perl uit letters, cijfer en de underscore, tenzij je met Unicode bezig bent) of juist niet:

code:
1
2
3
4
/\ber\b/  # "er" als los woord
/\Ber\b/  # "er" aan het einde van een woord
/\ber\b/ # "er" als los woord (bijv: "Het gaat er goed")
/\Ber\b/ # "er" aan het einde van een woord (bijv: "Achter de molen")




Character classes

Als kortere notatie voor keuzes tussen karakters kun je character classes gebruiken. Bijvoorbeeld om een teken te mathcen dat een "a", een "b" of een "c" kan zijn kan beide onderstaande contrcuties gebruiken:

code:
1
2
3
/a|b|c/  # alternatie: de normale "keuze"
/[abc]/  # character class van letters "a", "b" en "c"
/[a-c]/  # idem van de range van "a" tot en met "c"


Een character class is een opsomming van tekens, en binnen de character class (dus tussen de begin [ en de eind ] verliezen metacharacters als |, (, ), en . (waar ik het zo over heb) hun speciale betekenis.

code:
1
/[|(){}]/  # match het pipe symbool of een van de haken

Om binnen een character class een "-" te gebruiken kan je hem aan het begin (direct na de openingshaak), aan het einde van de class zetten of escapen:

code:
1
2
3
/[ac-z-]/  # match een kleine letter behalve b, of de min
/[-ac-z]/  # idem
/[a\-c-z]/ # idem


Kijk eens of je in de docs van jouw taal of tool kunt vinden hoe je een letterlijke "[" of "]" in een character class op kunt nemen.

Dit is als opstapje naar bijvoorbeeld PerlReTut en PerlRe voor details of PHP's PCRE en http://zez.org/article/articleprint/11/.

Doet iets met Cloud (MS/IBM)


Acties:
  • 0 Henk 'm!

Verwijderd

code:
1
2
3
4
5
 /a*/    # match 0 of meer keer "a"
/a+/    # match 1 of meer keer "a"
...
/a*/ # matcht 0 of meer keer "a" (bijv: '', 'a', 'aaaaaaa')
/a+/ # matcht 1 of meer keer "a" (bijv: 'a', 'aaaaa')
'*' en '+' 2 keer ?????

verder moet '?' nog wel uitgelegd worden,
en een paar voorbeelden van combinaties van allerlei metacharacters(pracatische voorbeelden) zouden ook niet verkeerd zijn

Na deze verbeteringen een zeer nuttige uitbereiding van de faq. :Y)

Acties:
  • 0 Henk 'm!

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 02-09 11:02

D2k

Op vrijdag 26 april 2002 16:26 schreef borganism het volgende:

[..]

'*' en '+' 2 keer ?????

verder moet '?' nog wel uitgelegd worden,
en een paar voorbeelden van combinaties van allerlei metacharacters(pracatische voorbeelden) zouden ook niet verkeerd zijn

Na deze verbeteringen een zeer nuttige uitbereiding van de faq. :Y)
* D2k kan zelf niet regexen :X
ik heb het alleen textueel verwerkt :P ;)
dus als je aanvullingen hebt spui ze maar

Doet iets met Cloud (MS/IBM)


Acties:
  • 0 Henk 'm!

  • chris
  • Registratie: September 2001
  • Laatst online: 11-03-2022
Als je de FAQ update, zet er dan meteen een functie om UBB code te maken erbij. 90% v/d users is alleen daar in geinteresseerd, scheelt weer werk. En inderdaad is het niet verkeerd om een aantal uitgebreide voorbeelden van allerlei combinaties te gebruiken.

Acties:
  • 0 Henk 'm!

  • tomato
  • Registratie: November 1999
  • Niet online
/dev/null: Als je de FAQ update, zet er dan meteen een functie om UBB code te maken erbij. 90% v/d users is alleen daar in geinteresseerd, scheelt weer werk.
Lijkt me niet helemaal de bedoeling van dit forum. Het doel van de FAQ is juist dat je met behulp van de informatie daaruit zelf tot een oplossing kunt komen (ja, daar is dus nog denkwerk voor nodig :o).

En daarnaast verleg je het probleem alleen maar met dergelijke kant en klare oplossingen. Wanneer je een compleet UBB verhaal in de FAQ plaatst krijg je vervolgens geen vragen meer naar UBB code, maar vragen als deze:
Hey,

was ff bezig met mijn forum en nou wilde ik ook die ubb codes enzo. jammer dat mijn vorige topic zo snel gesloten werd, maar ik heb voor jullie toch nog ff die faq doorgelezen.
maar in de faq staat geen script voor img tags en die wil ik juist wel! :( dus niet weer gelijk faq roepen in het vervolg!

kan iemand me helpen? *D

thanx, [insert random l33t user here] 8-)
Anyway, you get my point...

Acties:
  • 0 Henk 'm!

  • chris
  • Registratie: September 2001
  • Laatst online: 11-03-2022
Ok. Get the point. Die FAQ wordt waarschijnlijk toch alleen maar gelezen door mensen waarvoor geldt:
boolean n00bstatus = false

Maarja
Misschien kan je in dit lettertype toch stiekem een linkje naar een ubb topic leggen?

Acties:
  • 0 Henk 'm!

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 02-09 11:02

D2k

<h1> http://gathering.tweakers.net/forum/list_messages/392390/#regexen </h1>

moest toch nog wat dingen aan de faq doen ;)

Doet iets met Cloud (MS/IBM)


Acties:
  • 0 Henk 'm!

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 02-09 11:02

D2k

Op maandag 29 april 2002 22:06 schreef /dev/null het volgende:
Ok. Get the point. Die FAQ wordt waarschijnlijk toch alleen maar gelezen door mensen waarvoor geldt:
boolean n00bstatus = false
vrees van wel
Maarja
Misschien kan je in dit lettertype toch stiekem een linkje naar een ubb topic leggen?
lever maar een goed topic (er zijn er nogal het eea) dan zal ik wel kijken of ik um ergens (on) opvallend in kan vrotten ;)

Doet iets met Cloud (MS/IBM)

Pagina: 1