/ Forside / Teknologi / Operativsystemer / Linux / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Linux
#NavnPoint
o.v.n. 11177
peque 7911
dk 4814
e.c 2359
Uranus 1334
emesen 1334
stone47 1307
linuxrules 1214
Octon 1100
10  BjarneD 875
Regulaert udtryk
Fra : Kim Lethan


Dato : 07-12-01 23:24

Hej,

jeg staar med foelgende problem:

jeg har en streng: "<!--<script>a</script> b <script>c</script>-->d<!--e-->"

det jeg saa gerne vil er at faa fjernet <script> tagsne og det der staar i
mellem ved hjaelp af et regulaert udtryk.

Jeg har foelgende udtryk: "<script.*/script>" men problemet er at giver
giver "<!---->d<!--e-->" som output og ikke "<!--b -->d<!--e-->" som jeg
gerne vil have ud.

Paa forhaand tak for hjaelpen,

Kim Lethan



 
 
Claus Rasmussen (08-12-2001)
Kommentar
Fra : Claus Rasmussen


Dato : 08-12-01 00:08

Kim Lethan wrote:

> jeg har en streng:
>
> "<!--<script>a</script> b> <script>c</script>-->d<!--e-->"

[...]

> Jeg har foelgende udtryk: "<script.*/script>" men problemet er at giver
> giver "<!---->d<!--e-->" som output og ikke "<!--b -->d<!--e-->" som jeg
> gerne vil have ud.

Det er fordi regulære udtryk er grådige (det hedder det faktisk), så det
spiser så meget som muligt (.*) mellem det første "script" og det sidste
"/script".

Hvis du bruger perl kan du gøre sådan her i stedet:

perl -pe 's/<script>.*?<\/script>//g' filnavn

Spørgsmålstegnet i ".*?" gør det regulære udtryk mindre "sultent". Læs i
øvrigt mere om perl regulære udtryk på "man perlre".

-Claus


Kim Lethan (08-12-2001)
Kommentar
Fra : Kim Lethan


Dato : 08-12-01 15:59

> Hvis du bruger perl kan du gøre sådan her i stedet:

Jeg bruger desvaerre ikke Perl, jeg bruger SML.

> perl -pe 's/<script>.*?<\/script>//g' filnavn

Dette virker desvaerre ikke i SML.

--
Kim Lethan



Claus Rasmussen (08-12-2001)
Kommentar
Fra : Claus Rasmussen


Dato : 08-12-01 18:16

Kim Lethan wrote:

> Dette virker desvaerre ikke i SML.
^^^
Hvad er SML ?

-Claus


Klaus Alexander Seis~ (08-12-2001)
Kommentar
Fra : Klaus Alexander Seis~


Dato : 08-12-01 18:56

Claus Rasmussen skrev:

>> Dette virker desvaerre ikke i SML.
> ^^^
> Hvad er SML ?

Standard ML. Se <http://www.smlnj.org/sml.html>.


// Klaus

--
><>    vandag, môre, altyd saam

Jesper FA (08-12-2001)
Kommentar
Fra : Jesper FA


Dato : 08-12-01 20:56

Kim Lethan wrote:

> Jeg bruger desvaerre ikke Perl, jeg bruger SML.
>
>> perl -pe 's/<script>.*?<\/script>//g' filnavn
>
> Dette virker desvaerre ikke i SML.

Er det i ml-lex?
Eller kan man bruge det i normal pattern matching? Hvordan?

--
Jesper

Kim Lethan (09-12-2001)
Kommentar
Fra : Kim Lethan


Dato : 09-12-01 00:14


"Jesper FA" wrote:
> Er det i ml-lex?
> Eller kan man bruge det i normal pattern matching? Hvordan?

Du kan laese om det her:
http://www.dina.kvl.dk/~sestoft/mosmllib/Regex.html

--
Kim Lethan



Michael Hjorth (07-12-2001)
Kommentar
Fra : Michael Hjorth


Dato : 07-12-01 23:22

Kim Lethan wrote:
>
> Hej,
>
> jeg staar med foelgende problem:
>
> jeg har en streng: "<!--<script>a</script> b <script>c</script>-->d<!--e-->"
>
> det jeg saa gerne vil er at faa fjernet <script> tagsne og det der staar i
> mellem ved hjaelp af et regulaert udtryk.
>
> Jeg har foelgende udtryk: "<script.*/script>" men problemet er at giver
> giver "<!---->d<!--e-->" som output og ikke "<!--b -->d<!--e-->" som jeg
> gerne vil have ud.

Hvis der ikke kan være andre tags mellem <script> og </script> kan du
bruge:

"<script>[^<>]*<\/script>"

Michael.

Kim Lethan (08-12-2001)
Kommentar
Fra : Kim Lethan


Dato : 08-12-01 15:54

> Hvis der ikke kan være andre tags mellem <script> og </script> kan du
> bruge:
>
> "<script>[^<>]*<\/script>"

Problemmet med dette er at der f.eks. gerne maa vaere kommentarer (<!-- -->)
mellem <script> og </script>. Jeg tror jeg har en ide til hvordan det skal
loeses men jeg ved ikke hvordan jeg skal skrive det som et regulaert
uddtryk. Man starter med "<script" og saa en sekvens af tegn der bare ikke
maa indeholde </script> og til sidst skal der saa staa "</script>".

--
Kim Lethan



Claus Rasmussen (08-12-2001)
Kommentar
Fra : Claus Rasmussen


Dato : 08-12-01 19:22

Kim Lethan wrote:

>> Hvis der ikke kan være andre tags mellem <script> og </script> kan du
>> bruge:
>>
>> "<script>[^<>]*<\/script>"
>
> Problemmet med dette er at der f.eks. gerne maa vaere kommentarer (<!--
> -->) mellem <script> og </script>. Jeg tror jeg har en ide til hvordan det
> skal loeses men jeg ved ikke hvordan jeg skal skrive det som et regulaert
> uddtryk. Man starter med "<script" og saa en sekvens af tegn der bare ikke
> maa indeholde </script> og til sidst skal der saa staa "</script>".

Nemlig. Men det kan man bare ikke udtrykke i regulære sprog.

I stedet kan du gøre det ad to omgange: Først erstat alle <script>/</script>
med tegn, der ellers ikke forekommer. F.eks '#'/'@'

s/<script>/#/g (*)
s/</script>/@/g

Så kan vi udtrykke "sekvens af tegn, der ikke må indeholde </script> som

s/#[^@]*@//g

*) Eller s/<script[^>]*>//g hvis der kan være parametre til <script>.

-Claus


Jesper FA (09-12-2001)
Kommentar
Fra : Jesper FA


Dato : 09-12-01 00:04

Claus Rasmussen wrote:

> Kim Lethan wrote:
>
>>> Hvis der ikke kan være andre tags mellem <script> og </script> kan du
>>> bruge:
>>>
>>> "<script>[^<>]*<\/script>"
>>
>> Problemmet med dette er at der f.eks. gerne maa vaere kommentarer (<!--
>> -->) mellem <script> og </script>. Jeg tror jeg har en ide til hvordan
>> det skal loeses men jeg ved ikke hvordan jeg skal skrive det som et
>> regulaert uddtryk. Man starter med "<script" og saa en sekvens af tegn
>> der bare ikke maa indeholde </script> og til sidst skal der saa staa
>> "</script>".
>
> Nemlig. Men det kan man bare ikke udtrykke i regulære sprog.

Vil du bevise det?
Det er bare et spg. om at vælge første match istedet for længste.

Følgende transaktionstabel for en DFA burde løse problemet og da sprog for
DFA er lig sprog for regulære udtryk kan det også beskrives i et regulært
udtryk.

starttilstand 1, f=failure, a=accept
tilstand\input < s c r i p t > / andet
->1 2 f f f f f f f f f
2 f 3 f f f f f f f f
3 f f 4 f f f f f f f
4 f f f 5 f f f f f f
5 f f f f 6 f f f f f
6 f f f f f 7 f f f f
7 f f f f f f 8 f f f
8 f f f f f f f 9 f f
9 10 9 9 9 9 9 9 9 9 9
10 10 9 9 9 9 9 9 9 11 9
11 10 12 9 9 9 9 9 9 9 9
12 10 9 13 9 9 9 9 9 9 9
13 10 9 9 14 9 9 9 9 9 9
14 10 9 9 9 15 9 9 9 9 9
15 10 9 9 9 9 16 9 9 9 9
16 10 9 9 9 9 9 17 9 9 9
17 10 9 9 9 9 9 9 18 9 9
18a 10 f f f f f f f f f

Om det kan gøres pænt/kort i perl er så en anden ting. Det kommer an på om
der er en negations operator eg. skrevet som '~'. Er der det kan følgende
være et regulært udtryk i et passende sprog der løser problemet.

"<script>" . ~"</script>" . "</script>"

Og igen da negations operatoren er redundant kan det omskrives til et
udtryk uden brug af denne. Det bliver dog ikke så pænt.. Det må bliver til
noget lignende...

<script>([^<] | < ([^/] | / ([^s] | s ( ... ))))*</script>

Dette er dog ikke noget jeg har udregnet, men blot konstrueret løst ud fra
transaktionstabellen, så det kunne sagtens være forkert.

--
Jesper

Claus Rasmussen (09-12-2001)
Kommentar
Fra : Claus Rasmussen


Dato : 09-12-01 00:54

Jesper FA wrote:

> Claus Rasmussen wrote:
>
>> Nemlig. Men det kan man bare ikke udtrykke i regulære sprog.
>
> Vil du bevise det?

Nej !

Jeg sad godt nok og undrede mig over, om det virkeligt ikke kunne gøres i
RE, da jeg skrev det, men jeg kunne ikke komme i tanke om, hvordan.

[...]


> Om det kan gøres pænt/kort i perl er så en anden ting. Det kommer an på om
> der er en negations operator eg. skrevet som '~'. Er der det kan følgende
> være et regulært udtryk i et passende sprog der løser problemet.
>
> "<script>" . ~"</script>" . "</script>"

Der findes ikke i /almindelig/ perl RE mulighed for at negere en streng.
Kun enkelte tegn (som i [^abc]). Men perl's RE er efterhånden blevet
udvidet med så mange features, at jeg tror, man kan skrive kontekstfrie
sprog i det (med en gudsjammerlig syntaks ganske vist).

I perl er det nemmeste at gøre .* udtrykket non-greedy med ? operatoren.
Altså:

<script>(.*?)</script>


> Og igen da negations operatoren er redundant kan det omskrives til et
> udtryk uden brug af denne. Det bliver dog ikke så pænt.. Det må bliver til
> noget lignende...
>
> <script>([^<] | < ([^/] | / ([^s] | s ( ... ))))*</script>

Nemlig. Selv om det er temmeligt svært at gennemskue, hvad der foregår.

Hvor fik du i øvrigt det transitionssystem fra ?

-Claus


Jesper FA (09-12-2001)
Kommentar
Fra : Jesper FA


Dato : 09-12-01 01:49

Claus Rasmussen wrote:

>> Vil du bevise det?
>
> Nej !

Kan jeg godt forstå.

> Jeg sad godt nok og undrede mig over, om det virkeligt ikke kunne gøres i
> RE, da jeg skrev det, men jeg kunne ikke komme i tanke om, hvordan.

Man skal ikke lade sig snyde, bare fordi der er meget man ikke kan med RE
betyder det ikke at man ikke kan bare fordi man ikke lige kan se løsningen.
Kan du se hvad jeg mener?

>> Om det kan gøres pænt/kort i perl er så en anden ting. Det kommer an på
>> om der er en negations operator eg. skrevet som '~'. Er der det kan
>> følgende være et regulært udtryk i et passende sprog der løser problemet.
>>
>> "<script>" . ~"</script>" . "</script>"
>
> Der findes ikke i /almindelig/ perl RE mulighed for at negere en streng.

Tænkte jeg nok.. egentligt sjovt nok, for så svært burde det da ikke være
at konstruere. Negering af en DFA er rimeligt trivielt.

> Kun enkelte tegn (som i [^abc]). Men perl's RE er efterhånden blevet
> udvidet med så mange features, at jeg tror, man kan skrive kontekstfrie
> sprog i det (med en gudsjammerlig syntaks ganske vist).

Og vel lige så ringe udførselstid..

> I perl er det nemmeste at gøre .* udtrykket non-greedy med ? operatoren.
> Altså:
>
> <script>(.*?)</script>

Dvs. første/korteste match?

>> <script>([^<] | < ([^/] | / ([^s] | s ( ... ))))*</script>
>
> Nemlig. Selv om det er temmeligt svært at gennemskue, hvad der foregår.

Ja, ikke videre kønt. Gad vide hvordan det kommer til at se ud, hvis det
man skal negere ikke bare er en streng. Jeg mener nu heller ikke jeg har
set nogen algoritme for det, men den er nok ikke triviel.

> Hvor fik du i øvrigt det transitionssystem fra ?

Det konstruerede jeg selv. Det skulle vel ikke være så svært??

--
Jesper

Claus Rasmussen (09-12-2001)
Kommentar
Fra : Claus Rasmussen


Dato : 09-12-01 20:00

Jesper FA wrote:

> Claus Rasmussen wrote:
>>
>> Der findes ikke i /almindelig/ perl RE mulighed for at negere en streng.
>
> Tænkte jeg nok.. egentligt sjovt nok, for så svært burde det da ikke være
> at konstruere. Negering af en DFA er rimeligt trivielt.

Det skyldes sikkert, at hvis man tager definitionen af RE fra en lærebog
og implementerer den direkte, så får man ikke nogen operator til negering
af strenge. At det så ikke er kommet med i perl (der ellers ikke holder
sig tilbage med udvidelser) skyldes nok at Larry Wall er lidt krøllet i
hovedet.

[...]

>> I perl er det nemmeste at gøre .* udtrykket non-greedy med ? operatoren.
>> Altså:
>>
>> <script>(.*?)</script>
>
> Dvs. første/korteste match?

Korteste.


>>> <script>([^<] | < ([^/] | / ([^s] | s ( ... ))))*</script>
>>
>> Nemlig. Selv om det er temmeligt svært at gennemskue, hvad der foregår.
>
> Ja, ikke videre kønt. Gad vide hvordan det kommer til at se ud, hvis det
> man skal negere ikke bare er en streng. Jeg mener nu heller ikke jeg har
> set nogen algoritme for det, men den er nok ikke triviel.

Jeg fandt i øvrigt en nemmere måde, at skrive det på:

<script>((<[^/])|(</[^s])|(</s[^c])|(</sc[^r])|(</scr[^i])|(</scri[^p])|(</scrip[^t)|(</script[^>]))*</script>

Gør det lidt mere overskueligt. Hvis Kim læser med endnu, så er det den
_rigtige_ måde, at gøre det på.

-Claus


Jesper FA (09-12-2001)
Kommentar
Fra : Jesper FA


Dato : 09-12-01 23:40

Claus Rasmussen wrote:

> Jeg fandt i øvrigt en nemmere måde, at skrive det på:

<script>((<[^/])|(</[^s])|(</s[^c])|(</sc[^r])|(</scr[^i])|(</scri[^p])|(</scrip[^t)|(</script[^>]))*</script>

Ja, det er den samme løsning skrevet eksplicit ud. Så vidt jeg lige kan se
mangler du dog ([^<]) først.. Sådanne havde jeg også overvejet at skrive
det, men jeg synes det andet var mere fancy.. men jo, skal man bruge det i
praksis er denne måde nok bedre. Det er nok lettere at forstå om 2 måneder
hvad man mente.

--
Jesper

Kim Lethan (10-12-2001)
Kommentar
Fra : Kim Lethan


Dato : 10-12-01 20:35

Claus Rasmussen wrote:
> Jeg fandt i øvrigt en nemmere måde, at skrive det på:
>
>
<script>((<[^/])|(</[^s])|(</s[^c])|(</sc[^r])|(</scr[^i])|(</scri[^p])|(</s
crip[^t)|(</script[^>]))*</script>
>
> Gør det lidt mere overskueligt. Hvis Kim læser med endnu, så er det den
> _rigtige_ måde, at gøre det på.

Mange tak, nu har set hvordan man skal konstuere det.

--
Kim Lethan



Kim Lethan (09-12-2001)
Kommentar
Fra : Kim Lethan


Dato : 09-12-01 00:09


Claus Rasmussen wrote:
> I stedet kan du gøre det ad to omgange: Først erstat alle
<script>/</script>
> med tegn, der ellers ikke forekommer. F.eks '#'/'@'
>
> s/<script>/#/g (*)
> s/</script>/@/g
>
> Så kan vi udtrykke "sekvens af tegn, der ikke må indeholde </script> som
>
> s/#[^@]*@//g
>
> *) Eller s/<script[^>]*>//g hvis der kan være parametre til <script>.

Mange tak, det virker perfekt.

--
Kim Lethan




Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408903
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste