[EGREP] Regular expressions oefening

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • playermijp
  • Registratie: Juli 2011
  • Laatst online: 22-09 18:55
Beste,

Ik zit een beetje met m'n handen in m'n haar. Ik ben aan het oefenen op regular expressions in combinatie met egrep voor mijn examen binnen een paar weken. Normale reguliere expressies lukken me meestal vrij snel, maar er zijn enkele erg moeilijke regex die niet werken zoals ik verwacht en ik begrijp niet goed waarom. Ik moet volgende oefening oplossen:

Bepaal reguliere expressies voor volgende opdrachten:

Afbeeldingslocatie: http://78.20.240.66/cdn/tweakers/Opdracht%20regex.jpg

Ik heb zelf dit al gevonden, maar deze kloppen dus niet volledig:

a) egrep -v '[2468] *[1357]( *[1357] *[1357] *)*[2468]|^[1357]([1357][1357])*[2468]|[2468] *[1357]( *[1357] *[1357] *)* [a-zA-Z]*$' multitap.txt

b) egrep '^(( *[0-9]) *\2 *| *[02468] *[13579] *| *[13579] *[02468] *)+ [a-z]*$' multitap.txt

c) egrep '(^3[12456789])|([12456789]3[12456789])|([12456789]3 .*$)' multitap.txt

d) Heb ik niet gevonden

Het bestand waarop de expressies uitgevoerd moeten worden is dit.

Ik hoop dat jullie me kunnen helpen.
Alvast heel erg bedankt!

Acties:
  • 0 Henk 'm!

  • Super_ik
  • Registratie: Maart 2001
  • Laatst online: 16-10 18:46

Super_ik

haklust!

Is voor c dit niet voldoende:
grep -v 33 multitap.txt

8<------------------------------------------------------------------------------------
Als ik zo door ga haal ik m'n dood niet. | ik hou van goeie muziek


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Super_ik schreef op maandag 29 december 2014 @ 10:12:
Is voor c dit niet voldoende:
grep -v 33 multitap.txt
Bijna goed, alleen spaties nog. Maar het is niet echt de bedoeling om antwoorden te geven.

Acties:
  • 0 Henk 'm!

  • Super_ik
  • Registratie: Maart 2001
  • Laatst online: 16-10 18:46

Super_ik

haklust!

grep -v '3 ?3' multitap.txt dan?
en voor d zou ik iets doen met {2} ofzo

8<------------------------------------------------------------------------------------
Als ik zo door ga haal ik m'n dood niet. | ik hou van goeie muziek


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
lijkt me ook niet goed, want er moet minimaal 1 enkele 3 inzitten en er mag een dubbel paar zijn...

Maar ik denk dat TS beter kan opzoeken hoe regexen werken en hoe ^ daarin werkt, en wanneer het handig is om de hele regel te willen matchen (bij 'voor alle') en wanneer een subdeel handig is (bij 'er is een').

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • playermijp
  • Registratie: Juli 2011
  • Laatst online: 22-09 18:55
Ik heb weet wel wat ^ en $ doen en wanneer ik ze moet gebruiken, maar ik ga toch eens naar je tip kijken. Het lijkt me wel handig met die 'voor alle' en 'er bestaat'. Ik was dus begonnen met voor a) iets als dit te maken: egrep -v '[1357]( *[1357] *[1357])*' maar omdat grep global werkt matched dit ook met bijvoorbeeld 3333 omdat dit dan in 2 (oneven) groepen opgesplitst wordt. Dat kan ik oplossen door voor- en achteraan dit te plaatsen [2468], maar dan zit ik weer met een probleem met regels die beginnen en-of eindigen met een oneven getal. Snappen jullie m'n verwarring?

[ Voor 10% gewijzigd door playermijp op 29-12-2014 11:34 ]


Acties:
  • 0 Henk 'm!

  • deadinspace
  • Registratie: Juni 2001
  • Laatst online: 15-10 21:10

deadinspace

The what goes where now?

playermijp schreef op maandag 29 december 2014 @ 09:56:
a) egrep -v '\[2468] *\[1357]( *\[1357] *\[1357] *)*\[2468]|^\[1357](\[1357]\[1357])*\[2468]|\[2468] *\[1357]( *\[1357] *\[1357] *)* [a-zA-Z]*$' multitap.txt
Ik weet niet of het de bedoeling is dat je -v gebruikt; de opdracht zegt vrij duidelijk "geef reguliere expressies voor onderstaande verzamelingen", en met -v geef je daar het tegenovergestelde van natuurlijk... Maar dat kun je misschien aan je docent vragen.

Doe de opdrachten eerst zonder rekening te houden met spaties, dat is makkelijker. Support voor spaties kun je daarna toevoegen.

Voor a) is een "positieve" regular expression sowieso goed te doen. Probeer de input string eens op te breken in stukjes; waaraan moet elk stukje voldoen? Vertaal die stukjes naar een RE, en voeg ze weer samen.

a) is eigenlijk een herhaling van OF een even cijfer, OF twee dezelfde oneven cijfers. Daarmee zou je toch een eind moeten kunnen komen ;)

Acties:
  • 0 Henk 'm!

  • Juup
  • Registratie: Februari 2000
  • Niet online
Kunnen we voor a) niet iets doen als
JavaScript:
1
/^([02468]*(([13579])\3)*[02468]*)*$/

... en dan nog wat optionele spaties

[ Voor 23% gewijzigd door Juup op 29-12-2014 14:17 ]

Een wappie is iemand die gevallen is voor de (jarenlange) Russische desinformatiecampagnes.
Wantrouwen en confirmation bias doen de rest.


Acties:
  • 0 Henk 'm!

  • playermijp
  • Registratie: Juli 2011
  • Laatst online: 22-09 18:55
@deadinspace: Daarmee zou het inderdaad moeten lukken, maar dan nog gebeuren er rare dingen. Ik heb nu dit ^([2468][2468]|([13579])\2)* .*$ (Spaties even buiten beschouwing gelaten). Dit matched echter nog steeds met: "82 2555 555337772 2777 taalleraar" terwijl er hier duidelijk 3 dezelfde oneven cijfers na elkaar staan. Ik begrijp niet hoe dit nu nog gematched kan worden, aangezien er OF 2 even OF 2 dezelfde oneven cijfers na elkaar staan (toch niet 3??) of overlappen de matches die egrep uitvoert?

Alvast heel erg bedankt voor de hulp tot hier toe!

EDIT: Sorry, ik denk dat a opgelost is. Ik had een fout gemaakt door op het einde een aantal willekeurige karakters toe te laten, maar dit mogen enkel letters zijn, anders kan hij nog een deel van de cijfers ook matchen en dat verklaart mijn probleem denk ik. Correct is nu:
^([2468][2468]|([13579])\2)* [a-z]*$

[ Voor 21% gewijzigd door playermijp op 29-12-2014 16:43 ]


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
playermijp schreef op maandag 29 december 2014 @ 16:36:
EDIT: Sorry, ik denk dat a opgelost is. Ik had een fout gemaakt door op het einde een aantal willekeurige karakters toe te laten, maar dit mogen enkel letters zijn, anders kan hij nog een deel van de cijfers ook matchen en dat verklaart mijn probleem denk ik. Correct is nu:
^(\[2468]\[2468]|(\[13579])\2)* [a-z]*$
Komt in de buurt. Misschien eens testen? https://www.debuggex.com/r/m6PwK29h5VDEnJi7

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • playermijp
  • Registratie: Juli 2011
  • Laatst online: 22-09 18:55
Hartelijk dank! Dat ziet er een erg bruikbare website uit als hulpmiddel om te debuggen. Jullie hebben me al erg goed geholpen :)

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Een oud topic! Ik wilde nog zeggen dat d wel een geinige tricky oefening is voor iedereen die wil kijken of hij/zij regexpen echt snapt.

Opdracht d: Vind string van cijfers en optioneel te negeren enkele spaties welke maximaal 2 paren opeenvolgende gelijke cijfers bevat. Overlappende paren moeten in rekening gebracht worden; de reeks 222 telt dus 2 paren, de reeks 7777 telt 3 paren. String word gevolgd door een woord in [a-z]+ op een regel. Vind een grep commando om de juiste regels te matchen.
Voorbeeld te matchen regels:
1 test
62 287255 aap
Voorbeelden niet te matchen regels:
552 22 258 beer
43396663 cel
299992 deur

Met egrep lijkt me dit een ramp. ;)

Mijn oplossing:
spoiler:
echo 12223 test|grep -P '^((([^ ]) ?(?!\3))*(([^ ]) ?)?){1,3} [a-z]'
of https://www.debuggex.com/r/u1nwBC-0b_EX6xMS

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten

Pagina: 1