|
| 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:
>
>
> 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 =~ / /; ???
> 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:
>
>
> 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:
> 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 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 , så er det bare / / - ex.:
virgil $ perl -e '$buf="Hey ho!"; print "Match\n" if $buf=~/ /'
Match
virgil $ perl -e '$buf="injektionssprøjte"; print "Match\n" if $buf=~/ /'
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:
(ØSTERBROGADE) Ø 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Ø\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:
>
> > 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 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 , så er det bare / / - ex.:
>
> virgil $ perl -e '$buf="Hey ho!"; print "Match\n" if
$buf=~/ /'
> Match
> virgil $ perl -e '$buf="injektionssprøjte"; print "Match\n" if
$buf=~/ /'
> 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: (ØSTERBROGADE) Ø 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Ø\b/Ø/ig;
Fordi \b betyder "word boundary" - ovenstående matcher ikke
Østerbrogade, da der ikke er noget "word boundary" efter
semikolonnet.
$temp1=~/\bØ/Ø/ig;
ville jeg tro virkede for alle ord der starter med Ø (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 Ø med Ø ligegyldigt hvor det står i en
strengen er opskriften endnu simplere:
$temp1=~/Ø/Ø/g;
(Bemærk at jeg har fjernet i'et ("match case Insensitive"), da det
bevirker at f.ex. ø 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
> Ø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Ø/Ø/ig;
> ville jeg tro virkede for alle ord der starter med Ø (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 '$_ = " Ø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Ø/Ø/ig; ville jeg tro virkede for alle ord der
>> starter med Ø (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
> Østerbrogade, da der ikke er noget "word boundary" efter
> semikolonnet.
>
> $temp1=~/\bØ/Ø/ig;
>
> ville jeg tro virkede for alle ord der starter med Ø (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 Ø med Ø ligegyldigt hvor det står i en
> strengen er opskriften endnu simplere:
>
> $temp1=~/Ø/Ø/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. ø 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=~/Ø/Ø/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 = "Ø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 = "Ø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=~/Ø/Ø/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ØSTER\n"; $t=~s/Ø/Ø/g; print $t'
SØSTER
Bruger du et system med defekt locale? [Rent gæt].
Virker flg. i stedet:
virgil $ perl -e '$t="SØSTER\n"; $t=~s/Ø/\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: (ØSTERBROGADE) Ø 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Ø\b/Ø/ig;
\b matcher på word boundaries. Sådan et er der ikke efter ";".
Din substitution vil kun matche på "Ø", 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:
> (ØSTERBROGADE) Ø 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Ø\b/Ø/ig;
Check decode_entities i HTML::Entities. Meget nemmere.
--
Thorbjørn Ravn Andersen "...plus...Tubular Bells!"
http://bigfoot.com/~thunderbear
| |
|
|