Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Søg og erstat

10 views
Skip to first unread message

Kurt Hansen

unread,
Sep 17, 2012, 6:20:48 AM9/17/12
to
Jeg �nsker at finde en streng i HTML:

<head>*</head> forst�et som "start- og sluttag inklusive ALT hvad der
st�r imellem dem, inklusive linjeskift o.a.".

Den streng vil jeg s� erstatte med 'ingenting'.

Jeg har fors�gt mig i Mac's Terminal, men det kunne jeg slet ikke finde
ud af med alle de parametre.

HTML-editoren BlueFish (jeg arbejder p� Mac) kan imidlertid h�ndtere
Perl i sin s�gefunktion. Da jeg ikke kan se at den kan l�se fra
diskfiler, har jeg taget alle mine HTML-dokumenter og koblet dem sammen
i eet langt dokument.

S� indtaster jeg i s�gefeltet: <head>[^<].*</head>

Der er s�ledes mange forekomster af <head></head>. Det underlige er, at
n�r jeg starter s�gningen hopper den helt ned til linje 297, hvor der er
en <head>. selv om der er en i linje 5.

Ok, pyt med det, men n�r den s� finder den der er i linje 297, markerer
den ALT derfra til og med det sidste </head> p� linje 46.395.

Jeg er helt blank med Perl, men mener dog at vide, at [^<] f�r den til
at stoppe ved < i sluttagget?

Sp�rgsm�let er nu: Hvorfor stopper den ikke ved F�RSTE forekomst, men
ved sidste forekomst?
--
Venlig hilsen
Kurt Hansen

Peter Makholm

unread,
Sep 17, 2012, 7:38:49 AM9/17/12
to
Kurt Hansen <ku...@ugyldig.invalid> writes:

> Jeg ønsker at finde en streng i HTML:
>
> <head>*</head> forstået som "start- og sluttag inklusive ALT hvad der
> står imellem dem, inklusive linjeskift o.a.".

Regulære udtryk er ikke velegnede til at behandle SGML/XML lignende
sprog.

> Så indtaster jeg i søgefeltet: <head>[^<].*</head>

Oversættelse: Find strengen '<head>', efterfulgt af ét tegn der ikke er
'<', efterfulgt af så mange tegn som overhovedet muligt, efterfulgt af
'</head>'.

> Jeg er helt blank med Perl, men mener dog at vide, at [^<] får den til
> at stoppe ved < i sluttagget?

Havde du skrevet '[^<]*' havde den matchet indtil det næste '<'. Men det
ville højst sandsynligt ikke have været slut-tagget.

> Spørgsmålet er nu: Hvorfor stopper den ikke ved FØRSTE forekomst, men
> ved sidste forekomst?

Fordi kvantifiers (altså stjernen) notmalt er grådige. De matcher så
meget som overhovedet muligt. Hvis du sætter et spørgsmålstegn efter
stjernen vil den matche ikke-grådigt, altså så lidt som overhovedet
muligt.

Det vil sikkert løse dit umidelbare problem. Det vil sige:

<head>.*?</head>

Men det virker kun fordi (og hvis) du ikke har indlejrede <head>
tags. Det bliver noget noget forfærdelig rod hvis du skal gøre noget
tilsvarende med <div> tags der kan være indlejrede.

Husk: Regulære udtryk er ikke velegnede til at behandle SGML/XML
lignende sprog!

//Makholm

Kurt Hansen

unread,
Sep 17, 2012, 8:20:41 AM9/17/12
to
Den 17/09/12 13.38, Peter Makholm skrev:
> Kurt Hansen <ku...@ugyldig.invalid> writes:
>
>> Jeg ønsker at finde en streng i HTML:
>>
>> <head>*</head> forstået som "start- og sluttag inklusive ALT hvad der
>> står imellem dem, inklusive linjeskift o.a.".
>
> Regulære udtryk er ikke velegnede til at behandle SGML/XML lignende
> sprog.
>
>> Så indtaster jeg i søgefeltet: <head>[^<].*</head>

> Det vil sikkert løse dit umidelbare problem. Det vil sige:
>
> <head>.*?</head>
>
> Men det virker kun fordi (og hvis) du ikke har indlejrede <head>
> tags.

Det ville være helt usædvanligt. <head> og </head> forekommer kun een
gang i et HTML-dokument.

Jeg skal da hilse at sige at det virker. Jeg nåede ikke engang at blinke
med øjnene, før den havde erstattet alle forekomster i 46.000 linjer.

Jeg er meget glad for hjælpen og takker og bukker. Imponerende hurtigt,
fyldestgørende og forståeligt svar.
0 new messages