/ Forside / Teknologi / Udvikling / Perl / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Perl
#NavnPoint
bjarneA 141
poul_from 50
soccer 30
Nicknack 14
Tmpj 0
regular expressions
Fra : weaxler


Dato : 14-05-01 11:35

kan det passe jeg ikke kan genkende følgende linie:
 

med følgende regular expression:

$buf= ~/.*[nbsp]{4}.*/;

er der en speciel syntax for & tegn og ; , og er der nogle som kan lave en
expression som passer på dette?

weaxler



 
 
Peter Søgaard (14-05-2001)
Kommentar
Fra : Peter Søgaard


Dato : 14-05-01 11:48


"weaxler" <weaxler@cs.auc.dk> wrote in message
news:9doc2j$eju$1@sunsite.dk...
> kan det passe jeg ikke kan genkende følgende linie:
> &nbsp;
>
> med følgende regular expression:
>
> $buf= ~/.*[nbsp]{4}.*/;
>
Nej, for mig ser det ud til at den godt nok bliver genkendt.
Men hvad er det du prøver på med den regexp? du matcher godt nok "nbsp" men
også "nnnn","nbnb","spnn" etc. etc.

hvorfor ikke bare $buf =~ /&nbsp;/; ???

> er der en speciel syntax for & tegn og ; , og er der nogle som kan lave en
> expression som passer på dette?
>
> weaxler
>
>





Peter Makholm (14-05-2001)
Kommentar
Fra : Peter Makholm


Dato : 14-05-01 11:48

"weaxler" <weaxler@cs.auc.dk> writes:

> kan det passe jeg ikke kan genkende følgende linie:
> &nbsp;
>
> med følgende regular expression:
>
> $buf= ~/.*[nbsp]{4}.*/;

Bortset fra at dine mellemrum står forkert. Lighedstegnet og tilden må
ikke være adskilt af et mellemrum. Iøvrigt vil dit regulære udtryk
fange linjer hvori strengen "nnnn" indgår, er det det du vil?

--
hash-bang-slash-bin-slash-bash

Adam Sjøgren (14-05-2001)
Kommentar
Fra : Adam Sjøgren


Dato : 14-05-01 11:51

On Mon, 14 May 2001 12:35:11 +0200, weaxler wrote:

> kan det passe jeg ikke kan genkende følgende linie: &nbsp;

> med følgende regular expression:

> $buf= ~/.*[nbsp]{4}.*/;

Nej.

Den operator du vil bruge hedder "=~" ikke "= ~" - måske er det
problemet?

Det match'er ihvertfald fint:

virgil$ perl -e '$buf="Hey&nbsp;ho!"; print "Match\n" if $buf=~/.*[nbsp]{4}.*/'
Match
virgil$

Men det matcher naturligvis også alt muligt andet:

virgil$ perl -e '$buf="injektionssprøjte"; print "Match\n" if $buf=~/.*[nbsp]{4}.*/'
Match
virgil$

> er der en speciel syntax for & tegn og ; , og er der nogle som kan
> lave en expression som passer på dette?

Hvis du kun vil match'e &nbsp;, så er det bare /&nbsp;/ - ex.:

virgil$ perl -e '$buf="Hey&nbsp;ho!"; print "Match\n" if $buf=~/&nbsp;/'
Match
virgil$ perl -e '$buf="injektionssprøjte"; print "Match\n" if $buf=~/&nbsp;/'
virgil$


Mvh.

--
"How come we play war and not peace?" Adam Sjøgren
"Too few role models." asjo@koldfront.dk

weaxler (14-05-2001)
Kommentar
Fra : weaxler


Dato : 14-05-01 13:42

tak, det virkede fint, men hvorfor kan jeg ikke lave følgende substitution:
(&Oslash;STERBROGADE) &Oslash; skal laves til et stort Ø, så der står
ØSTERBROGADE, dette skal gøres ved alle forkomster i en tekststreng, og jeg
gør det sådan her:

$temp1=~s/\b&Oslash;\b/Ø/ig;

weaxler

"Adam Sjøgren" <asjo@koldfront.dk> wrote in message
news:87k83ktd9k.fsf@virgil.koldfront.dk...
> On Mon, 14 May 2001 12:35:11 +0200, weaxler wrote:
>
> > kan det passe jeg ikke kan genkende følgende linie: &nbsp;
>
> > med følgende regular expression:
>
> > $buf= ~/.*[nbsp]{4}.*/;
>
> Nej.
>
> Den operator du vil bruge hedder "=~" ikke "= ~" - måske er det
> problemet?
>
> Det match'er ihvertfald fint:
>
> virgil$ perl -e '$buf="Hey&nbsp;ho!"; print "Match\n" if
$buf=~/.*[nbsp]{4}.*/'
> Match
> virgil$
>
> Men det matcher naturligvis også alt muligt andet:
>
> virgil$ perl -e '$buf="injektionssprøjte"; print "Match\n" if
$buf=~/.*[nbsp]{4}.*/'
> Match
> virgil$
>
> > er der en speciel syntax for & tegn og ; , og er der nogle som kan
> > lave en expression som passer på dette?
>
> Hvis du kun vil match'e &nbsp;, så er det bare /&nbsp;/ - ex.:
>
> virgil$ perl -e '$buf="Hey&nbsp;ho!"; print "Match\n" if
$buf=~/&nbsp;/'
> Match
> virgil$ perl -e '$buf="injektionssprøjte"; print "Match\n" if
$buf=~/&nbsp;/'
> virgil$
>
>
> Mvh.
>
> --
> "How come we play war and not peace?" Adam
Sjøgren
> "Too few role models."
asjo@koldfront.dk



Adam Sjøgren (14-05-2001)
Kommentar
Fra : Adam Sjøgren


Dato : 14-05-01 14:06

On Mon, 14 May 2001 14:42:01 +0200, weaxler wrote:

> tak, det virkede fint, men hvorfor kan jeg ikke lave følgende
> substitution: (&Oslash;STERBROGADE) &Oslash; skal laves til et stort
> Ø, så der står ØSTERBROGADE, dette skal gøres ved alle forkomster i
> en tekststreng, og jeg gør det sådan her:

> $temp1=~s/\b&Oslash;\b/Ø/ig;

Fordi \b betyder "word boundary" - ovenstående matcher ikke
&Oslash;sterbrogade, da der ikke er noget "word boundary" efter
semikolonnet.

$temp1=~/\b&Oslash;/Ø/ig;

ville jeg tro virkede for alle ord der starter med &Oslash; (men det
gør det ikke, måske fordi &-tegnet ikke anses som værende noget der
kan starte et "ord"?)

Hvis du vil udskifte &Oslash; med Ø ligegyldigt hvor det står i en
strengen er opskriften endnu simplere:

$temp1=~/&Oslash;/Ø/g;

(Bemærk at jeg har fjernet i'et ("match case Insensitive"), da det
bevirker at f.ex. &oslash; også bliver til Ø (hvilket jo er
"forkert")).

Kig evt. på 'perldoc perlre' og meget gerne på:
<http://usenet.dk/netikette/quote.html#nedenunder>


Mvh.

--
"How come we play war and not peace?" Adam Sjøgren
"Too few role models." asjo@koldfront.dk

Trond Michelsen (14-05-2001)
Kommentar
Fra : Trond Michelsen


Dato : 14-05-01 14:22

"Adam Sjøgren" <asjo@koldfront.dk> wrote in message
news:87bsowt718.fsf@virgil.koldfront.dk...
> Fordi \b betyder "word boundary" - ovenstående matcher ikke
> &Oslash;sterbrogade, da der ikke er noget "word boundary" efter
> semikolonnet.

Joda, det er det. Det er et \b mellom h og ; og ; og s

> $temp1=~/\b&Oslash;/Ø/ig;
> ville jeg tro virkede for alle ord der starter med &Oslash; (men det
> gør det ikke, måske fordi &-tegnet ikke anses som værende noget der
> kan starte et "ord"?)

Nei. \b er overgangen fra \w til \W og omvendt. Så det er en \b mellom &
og O, men ikke foran &.

perl -e '$_ = " &Oslash;STERBROGADE "; $, = "<->"; $\ = "<-\n";print
"->", split /\b/'
-><-> &<->Oslash<->;<->STERBROGADE<-> <-

--
Trond Michelsen




Adam Sjøgren (14-05-2001)
Kommentar
Fra : Adam Sjøgren


Dato : 14-05-01 14:41

On Mon, 14 May 2001 15:22:07 +0200, Trond Michelsen wrote:

> Joda, det er det. Det er et \b mellom h og ; og ; og s

Ahh, jeg havde fået byttet om på hvilket af \b'erne der ikke gjorde
det jeg troede det gjorde

>> $temp1=~/\b&Oslash;/Ø/ig; ville jeg tro virkede for alle ord der
>> starter med &Oslash; (men det gør det ikke, måske fordi &-tegnet
>> ikke anses som værende noget der kan starte et "ord"?)

> Nei. \b er overgangen fra \w til \W og omvendt. Så det er en \b
> mellom & og O, men ikke foran &.

Ahh - sådan, tak!


Mvh.

--
"kalasbyxor, ettagluttare, blängsylta, lånbytas Adam Sjøgren
sockiplast, tjejlöss, killbaciller, gosedjur..." asjo@koldfront.dk

Torben Simonsen (14-05-2001)
Kommentar
Fra : Torben Simonsen


Dato : 14-05-01 14:49

asjo@koldfront.dk (Adam Sjøgren) writes:

> On Mon, 14 May 2001 15:22:07 +0200, Trond Michelsen wrote:
>
> > Joda, det er det. Det er et \b mellom h og ; og ; og s
>
> Ahh, jeg havde fået byttet om på hvilket af \b'erne der ikke gjorde
> det jeg troede det gjorde

Som du kunne se, så faldt jeg også i vandet på den. Æv!

--
-- Torben.

weaxler (14-05-2001)
Kommentar
Fra : weaxler


Dato : 14-05-01 14:33


"Adam Sjøgren" <asjo@koldfront.dk> wrote in message
news:87bsowt718.fsf@virgil.koldfront.dk...

> Fordi \b betyder "word boundary" - ovenstående matcher ikke
> &Oslash;sterbrogade, da der ikke er noget "word boundary" efter
> semikolonnet.
>
> $temp1=~/\b&Oslash;/Ø/ig;
>
> ville jeg tro virkede for alle ord der starter med &Oslash; (men det
> gør det ikke, måske fordi &-tegnet ikke anses som værende noget der
> kan starte et "ord"?)
>
> Hvis du vil udskifte &Oslash; med Ø ligegyldigt hvor det står i en
> strengen er opskriften endnu simplere:
>
> $temp1=~/&Oslash;/Ø/g;
>
Det virker bare desværre ikke, jeg får følgende fejl:

Unrecognized character \330 at test.pl line 104.


> (Bemærk at jeg har fjernet i'et ("match case Insensitive"), da det
> bevirker at f.ex. &oslash; også bliver til Ø (hvilket jo er
> "forkert")).
>mvh.
>
> --
> "How come we play war and not peace?" Adam
Sjøgren
> "Too few role models."
asjo@koldfront.dk



Trond Michelsen (14-05-2001)
Kommentar
Fra : Trond Michelsen


Dato : 14-05-01 14:46

"weaxler" <weaxler@cs.auc.dk> wrote in message
news:9domkl$ega$1@sunsite.dk...
>> $temp1=~/&Oslash;/Ø/g;
> Det virker bare desværre ikke, jeg får følgende fejl:
> Unrecognized character \330 at test.pl line 104.

Det er forresten mye, mye, mye bedre å bruke en modul til dette.

use HTML::Entites qw/decode_entities/;

$string = "&Oslash;sterbrogade";
decode_entities($string);


Hvis du absolutt ikke vil bruke modulen, så bør du ihvertfall bruke en
regex som takler mer enn en entity av gangen

my %entities = (
aelig => 'æ',
oslash => 'ø',
aring => 'å',
Aelig => 'Æ',
Oslash => 'Ø',
Aring => 'Å',
);

my $entities = join '|' => keys %entities;
$string = "&Oslash;sterbrogade";
$string =~ s/&($entities);/$entities{$1}/g;

(litt forenklet så er det slik HTML::Entities fungerer)

--
Trond Michelsen



Adam Sjøgren (14-05-2001)
Kommentar
Fra : Adam Sjøgren


Dato : 14-05-01 14:47

On Mon, 14 May 2001 15:33:11 +0200, weaxler wrote:

>> $temp1=~/&Oslash;/Ø/g;

[Hov, der er røget et 's' i skyndingen ]

> Det virker bare desværre ikke, jeg får følgende fejl:

> Unrecognized character \330 at test.pl line 104.

Det virker fint hér:

virgil$ perl -e '$t="S&Oslash;STER\n"; $t=~s/&Oslash;/Ø/g; print $t'
SØSTER

Bruger du et system med defekt locale? [Rent gæt].

Virker flg. i stedet:

virgil$ perl -e '$t="S&Oslash;STER\n"; $t=~s/&Oslash;/\330/g; print $t'
SØSTER

?


Mvh.

--
"kalasbyxor, ettagluttare, blängsylta, lånbytas Adam Sjøgren
sockiplast, tjejlöss, killbaciller, gosedjur..." asjo@koldfront.dk

Torben Simonsen (14-05-2001)
Kommentar
Fra : Torben Simonsen


Dato : 14-05-01 14:14

"weaxler" <weaxler@cs.auc.dk> writes:

> tak, det virkede fint, men hvorfor kan jeg ikke lave følgende
> substitution: (&Oslash;STERBROGADE) &Oslash; skal laves til et stort
> Ø, så der står ØSTERBROGADE, dette skal gøres ved alle forkomster i en
> tekststreng, og jeg gør det sådan her:
>
> $temp1=~s/\b&Oslash;\b/Ø/ig;

\b matcher på word boundaries. Sådan et er der ikke efter ";".
Din substitution vil kun matche på "&Oslash;", når det står som
et alenestående ord med "non-word characters" (hvilket vil sige
tegn, der ikke er i [a-zA-Z_0-9]) på begge sider.

--
-- Torben.

Thorbjørn Ravn Ander~ (14-05-2001)
Kommentar
Fra : Thorbjørn Ravn Ander~


Dato : 14-05-01 18:09



weaxler wrote:
>
> tak, det virkede fint, men hvorfor kan jeg ikke lave følgende substitution:
> (&Oslash;STERBROGADE) &Oslash; skal laves til et stort Ø, så der står
> ØSTERBROGADE, dette skal gøres ved alle forkomster i en tekststreng, og jeg
> gør det sådan her:
>
> $temp1=~s/\b&Oslash;\b/Ø/ig;

Check decode_entities i HTML::Entities. Meget nemmere.
--
Thorbjørn Ravn Andersen "...plus...Tubular Bells!"
http://bigfoot.com/~thunderbear

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

Månedens bedste
Årets bedste
Sidste års bedste