Page 1 of 1

[CS] Regular expressions and sed

Posted: Sun Oct 21, 2012 12:15 pm
by Flipper
Hier ben ik weer met een vraagje :?:

Voor de praktijk systemen moeten we een reeks regular expressions en seds vinden, voor alle opdrachten heb ik wel een expressie gevonden, alleen zit ik nu vast met de laatste oefening. Daar vragen ze om een sed command te vinden die HTML tags uitvoert. Dus voor dit:

Code: Select all

<h1>This is a valid HTML tag</h1>.
<i>These</b> <1>invalid</i> <a}>tags</a}> should be ignored.
Moet ik dit krijgen:

Code: Select all

This is a valid HTML tag.
<i>These</b> <1>invalid</i> <a}>tags</a}> should be ignored.
Ik gebruikte hiervoor de volgende command:

Code: Select all

sed "s|<[\/]\{0,1\}[a-zA-Z0-9]*>||g" < test.txt
Maar in plaats van de gewenste resultaten te krijgen, krijg ik als output dit:

Code: Select all

This is a valid HTML tag.
These invalid <a}>tags</a}> should be ignored.
Met de eerste lijn is er niks aan de hand, de HTML-tags worden echt wel weggehaald, maar met de tweede lijn zou de command er niets mee mogen doen omdat de tags daar niet juist staan.

Iemand een idee wat er met mijn code verkeerd is? :?

Re: [CS] Regular expressions and sed

Posted: Sun Oct 21, 2012 1:37 pm
by timvdm
Je moet overeenkomende tags matchen. Dus kan je iets doen zoals:

Code: Select all


s|<\(...\)>...</\1>|...|g
De ... moet je nog invullen maar met die \1 ga je enkel tags verwijderen die overeenkomen (bvb. <h1>...</h1> en niet <i>...</b>)

Re: [CS] Regular expressions and sed

Posted: Sun Oct 21, 2012 5:56 pm
by Flipper
Ik krijg dan steeds een error met de melding: "ongeldige terugverwijzing"...

Re: [CS] Regular expressions and sed

Posted: Sun Oct 21, 2012 6:04 pm
by djgl3nn
de terugverwijzing \1 wijst naar wat er onthouden is tussen de eerste haakjes ( )
gebruik wel ( ) ipv \( \)
(Indien je ze escaped zoekt hij naar de symbolen '(' & ')' ipv het te gebruiken voor een backreference )

Re: [CS] Regular expressions and sed

Posted: Sun Oct 21, 2012 6:23 pm
by timvdm
djgl3nn wrote:de terugverwijzing \1 wijst naar wat er onthouden is tussen de eerste haakjes ( )
gebruik wel ( ) ipv \( \)
(Indien je ze escaped zoekt hij naar de symbolen '(' & ')' ipv het te gebruiken voor een backreference )
De haakjes moeten wel degelijk geescaped worden. \( en \) zijn net zoals \< en \> of \{ en \}.

Re: [CS] Regular expressions and sed

Posted: Sun Oct 21, 2012 6:34 pm
by timvdm
Flipper wrote:Ik krijg dan steeds een error met de melding: "ongeldige terugverwijzing"...
Probeer systematisch je expressie op te bouwen. Je kan eerste de expressie maken die je gaat matchen mbv grep. Bij Ubuntu linux gaat grep bij default de match highlighten dus zo kan je alvast het eerste deel oplossen.

Bijvoorbeeld start met dit:

Code: Select all

grep '<\(.*\)>.*</\1>' test.txt
Dit werkt maar je moet er nog voor zorgen dat geen ongeldige tags matched (e.g. <a}>...</a}>) [eerste .*] en ook at je geen nested tages matched (e.g. <i>...</b> <1>...</i>) wat je met de niet ^ kan oplossen [tweede .*].

Re: [CS] Regular expressions and sed

Posted: Sun Oct 21, 2012 7:09 pm
by djgl3nn
If so, what a strange syntrax.

Re: [CS] Regular expressions and sed

Posted: Sun Oct 21, 2012 7:32 pm
by Flipper
HOER(a)! gevonden! :highfive:
djgl3nn wrote:If so, what a strange syntrax.
Klopt, ik heb het ook geprobeerd zonder te escapen, dat werkt niet blijkbaar en ik wordt helemaal knetter met die \>/)({}[]-tekens, ik zal maar stoppen voor vandaag..