/ 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
Regexp i et ord og ikke et del af ordet
Fra : Claus Jul Larsen


Dato : 05-08-02 11:12

Hej,

Hvordan laver man en regexp, hvor man finder alle ordene og IKKE en del
af et ord. F.eks. ønsker jeg at erstatte alle forekomster af 'havn' og
IKKE københavn, hvor havn indgår i ordet. Altså en præcis replace af et
ord og ikke en del af et ord.

Claus


 
 
Peter Makholm (05-08-2002)
Kommentar
Fra : Peter Makholm


Dato : 05-08-02 11:44

Claus Jul Larsen <cjl@steria.dk> writes:

> Hvordan laver man en regexp, hvor man finder alle ordene

\b matcher en ordgrænse, så s/\bfoo\b/bar/g laver "foo" om til "bar"
uden at ændre 'foobar' til 'barbar'.

--
Peter Makholm | If you can't do any damage as root, are you still
peter@makholm.net | really root?
http://hacking.dk | -- Derek Gladding about SELinux

Claus Jul Larsen (08-08-2002)
Kommentar
Fra : Claus Jul Larsen


Dato : 08-08-02 12:14

Hej,

Tak! Det virker, men til gengæld kommer der et andet problem op: Hvis et
ord indholder specialtegn såsom ?'% og lign. Hvad gør jeg så?

Claus

Peter Makholm wrote:

> Claus Jul Larsen <cjl@steria.dk> writes:
>
>
>>Hvordan laver man en regexp, hvor man finder alle ordene
>>
>
> \b matcher en ordgrænse, så s/\bfoo\b/bar/g laver "foo" om til "bar"
> uden at ændre 'foobar' til 'barbar'.
>
>


P (08-08-2002)
Kommentar
Fra : P


Dato : 08-08-02 12:28

Claus Jul Larsen <cjl@steria.dk> writes:

> Tak! Det virker, men til gengæld kommer der et andet problem op: Hvis
> et ord indholder specialtegn såsom ?'% og lign. Hvad gør jeg så?

Se på (?<=patttern) istedet for det første \b og (?=pattern) som det
andet hvor pattern matcher hvad du mener adskiller ord.

--
- P

Claus Jul Larsen (08-08-2002)
Kommentar
Fra : Claus Jul Larsen


Dato : 08-08-02 13:05

Hej,

Jeg er ikke helt med, men hvis du giver mig et eksempel på, hvordan man
laver en replace på f.eks.

Har du husket at tage madpakken med? <- Her er et sprøgsmålstegn
Det er ikke "særligt" godt det her <- Her er et par " i sætningen

Det jeg ønsker er at matche ordgrænser med specialtegn i sig selv.

Claus
P wrote:

> Claus Jul Larsen <cjl@steria.dk> writes:
>
>
>>Tak! Det virker, men til gengæld kommer der et andet problem op: Hvis
>>et ord indholder specialtegn såsom ?'% og lign. Hvad gør jeg så?
>>
>
> Se på (?<=patttern) istedet for det første \b og (?=pattern) som det
> andet hvor pattern matcher hvad du mener adskiller ord.
>
>


Lars Balker Rasmusse~ (08-08-2002)
Kommentar
Fra : Lars Balker Rasmusse~


Dato : 08-08-02 22:24

Claus Jul Larsen <cjl@steria.dk> writes:
> Jeg er ikke helt med, men hvis du giver mig et eksempel på, hvordan
> man laver en replace på f.eks.
>
> Har du husket at tage madpakken med? <- Her er et sprøgsmålstegn
> Det er ikke "særligt" godt det her <- Her er et par " i sætningen
>
> Det jeg ønsker er at matche ordgrænser med specialtegn i sig selv.

Ikke forstået. Giv et fyldigt eksempel på input og hvad du ønsker at gøre
ved det, så kan vi nok hjælpe dig.
--
Lars Balker Rasmussen                  "S.M.R.T."

Claus Jul Larsen (25-08-2002)
Kommentar
Fra : Claus Jul Larsen


Dato : 25-08-02 10:25

OK, jeg prøver at komme med et bedre eksempel:

Hvis jeg skriver:

$string =~ s/\bMit navn er\b/My name is/gi;

Så bliver "Mit navn er" oversat til "My name is" - ingen problemer der. Men
.....

$string =~ s/\bMit navn er:\b/My name is/gi;

Så bliver det ikke replaceret, ganske fordi der indgår en ":" i ordet.

Jeg ønsker at have mulighed for at det virker med \b og andre tegn, f.eks.
?":;. .... Kan man det?

Claus

"Lars Balker Rasmussen" <lars@balker.org> skrev i en meddelelse
news:0fk7n13uzb.fsf@laphroaig.balker.org...
> Claus Jul Larsen <cjl@steria.dk> writes:
> > Jeg er ikke helt med, men hvis du giver mig et eksempel på, hvordan
> > man laver en replace på f.eks.
> >
> > Har du husket at tage madpakken med? <- Her er et sprøgsmålstegn
> > Det er ikke "særligt" godt det her <- Her er et par " i sætningen
> >
> > Det jeg ønsker er at matche ordgrænser med specialtegn i sig selv.
>
> Ikke forstået. Giv et fyldigt eksempel på input og hvad du ønsker at gøre
> ved det, så kan vi nok hjælpe dig.
> --
> Lars Balker Rasmussen "S.M.R.T."



Lars Balker Rasmusse~ (25-08-2002)
Kommentar
Fra : Lars Balker Rasmusse~


Dato : 25-08-02 11:40

"Claus Jul Larsen" <clausanne@mail.dk> writes:
> OK, jeg prøver at komme med et bedre eksempel:
>
> Hvis jeg skriver:
>
> $string =~ s/\bMit navn er\b/My name is/gi;
>
> Så bliver "Mit navn er" oversat til "My name is" - ingen problemer der. Men
> ....
>
> $string =~ s/\bMit navn er:\b/My name is/gi;
>
> Så bliver det ikke replaceret, ganske fordi der indgår en ":" i ordet.
>
> Jeg ønsker at have mulighed for at det virker med \b og andre tegn, f.eks.
> ?":;. .... Kan man det?

Du har stadig ikke fortalt hvad $string indeholder.

Ovenstående virker begge fint, hvis $string indeholder f.eks.

$string = "Mit navn er: Yo.";

Så det er stadig ikke helt nemt at gætte hvad du vil!

Hvis du bare ønsker at et vilkårligt ikke-bogstav skal matches med
hvis det er der, kan du bruge

$string =~ s/\bMit navn er\b\W?/My name is/gi;
--
Lars Balker Rasmussen                  "S.M.R.T."

Claus Jul Larsen (25-08-2002)
Kommentar
Fra : Claus Jul Larsen


Dato : 25-08-02 13:18

Hej igen,

$string er en mængde tekst, hvor jeg ønsker at oversætte.

Problemet heri er, at hvis jeg ikke bruger \b så vil "kr" matche i f.eks.
skrive - jeg vil kun have det, at den matcher præcis det ordgrænse incl.
tegn såsom .,! osv. Det er som om, at hvis jeg bruger \b - og der er
ikke-bogstav indeni, så virker det ikke.

F.eks.

$string =~ s/\bVenligst indtast din e-mail adresse i feltet
'E-mail'\b/Please write your e-mail/gi;

virker ikke da der er quotes i E-mail, mens

$string =~ s/\bSend spørgsmål\b/Send the question/gi;

virker, fordi der kun består af bogstaver.

Håber du har fat på det nu

Claus

"Lars Balker Rasmussen" <lars@balker.org> skrev i en meddelelse
news:0fsn13rzl1.fsf@laphroaig.balker.org...
> "Claus Jul Larsen" <clausanne@mail.dk> writes:
> > OK, jeg prøver at komme med et bedre eksempel:
> >
> > Hvis jeg skriver:
> >
> > $string =~ s/\bMit navn er\b/My name is/gi;
> >
> > Så bliver "Mit navn er" oversat til "My name is" - ingen problemer der.
Men
> > ....
> >
> > $string =~ s/\bMit navn er:\b/My name is/gi;
> >
> > Så bliver det ikke replaceret, ganske fordi der indgår en ":" i ordet.
> >
> > Jeg ønsker at have mulighed for at det virker med \b og andre tegn,
f.eks.
> > ?":;. .... Kan man det?
>
> Du har stadig ikke fortalt hvad $string indeholder.
>
> Ovenstående virker begge fint, hvis $string indeholder f.eks.
>
> $string = "Mit navn er: Yo.";
>
> Så det er stadig ikke helt nemt at gætte hvad du vil!
>
> Hvis du bare ønsker at et vilkårligt ikke-bogstav skal matches med
> hvis det er der, kan du bruge
>
> $string =~ s/\bMit navn er\b\W?/My name is/gi;
> --
> Lars Balker Rasmussen "S.M.R.T."



Lars Balker Rasmusse~ (25-08-2002)
Kommentar
Fra : Lars Balker Rasmusse~


Dato : 25-08-02 14:00

"Claus Jul Larsen" <clausanne@mail.dk> writes:
> Problemet heri er, at hvis jeg ikke bruger \b så vil "kr" matche i f.eks.
> skrive - jeg vil kun have det, at den matcher præcis det ordgrænse incl.
> tegn såsom .,! osv. Det er som om, at hvis jeg bruger \b - og der er
> ikke-bogstav indeni, så virker det ikke.
>
> F.eks.
>
> $string =~ s/\bVenligst indtast din e-mail adresse i feltet
> 'E-mail'\b/Please write your e-mail/gi;
>
> virker ikke da der er quotes i E-mail, mens
>
> $string =~ s/\bSend spørgsmål\b/Send the question/gi;
>
> virker, fordi der kun består af bogstaver.
>
> Håber du har fat på det nu

\b matcher ikke et tegn, men indikerer blot et skel imellem et \w
(a-z, A-Z, 0-9, _ og evt. danske tegn) og et \W (alt andet). Da '
ikke er i \w, og et eventuelt efterfølgende mellemrum eller komma
heller ikke er i \w, er der ikke noget skel!

Du skal altså kun bruge \b før/efter bogstaver.
--
Lars Balker Rasmussen                  "S.M.R.T."

Claus Jul Larsen (25-08-2002)
Kommentar
Fra : Claus Jul Larsen


Dato : 25-08-02 19:09

Det vil sige, at det altså er ikke muligt at lave en match med \W-tegn i en
\b ... \b ?

Claus

"Lars Balker Rasmussen" <lars@balker.org> skrev i en meddelelse
news:0fofbrrt50.fsf@laphroaig.balker.org...
> "Claus Jul Larsen" <clausanne@mail.dk> writes:
> > Problemet heri er, at hvis jeg ikke bruger \b så vil "kr" matche i
f.eks.
> > skrive - jeg vil kun have det, at den matcher præcis det ordgrænse incl.
> > tegn såsom .,! osv. Det er som om, at hvis jeg bruger \b - og der er
> > ikke-bogstav indeni, så virker det ikke.
> >
> > F.eks.
> >
> > $string =~ s/\bVenligst indtast din e-mail adresse i feltet
> > 'E-mail'\b/Please write your e-mail/gi;
> >
> > virker ikke da der er quotes i E-mail, mens
> >
> > $string =~ s/\bSend spørgsmål\b/Send the question/gi;
> >
> > virker, fordi der kun består af bogstaver.
> >
> > Håber du har fat på det nu
>
> \b matcher ikke et tegn, men indikerer blot et skel imellem et \w
> (a-z, A-Z, 0-9, _ og evt. danske tegn) og et \W (alt andet). Da '
> ikke er i \w, og et eventuelt efterfølgende mellemrum eller komma
> heller ikke er i \w, er der ikke noget skel!
>
> Du skal altså kun bruge \b før/efter bogstaver.
> --
> Lars Balker Rasmussen "S.M.R.T."



Adam Sjøgren (25-08-2002)
Kommentar
Fra : Adam Sjøgren


Dato : 25-08-02 14:03

On Sun, 25 Aug 2002 14:17:42 +0200, Claus Jul Larsen wrote:

> $string =~ s/\bVenligst indtast din e-mail adresse i feltet
> 'E-mail'\b/Please write your e-mail/gi;

> virker ikke da der er quotes i E-mail, mens

Mon det er fordi der er ikke noget word-boundary efter det sidste " i
en streng hvor der f.ex. står

i feltet "E-mail" og husk at

Der er f.ex. boundary efter l'et i E-mail og før o'et i og, men ikke
efter plingen:

asjo@flora$ perl -e '$s="i feltet \"E-mail\" og husk at\n"; print $s; $s=~s/\b/WB/g; print $s;'
i feltet "E-mail" og husk at
WBiWB WBfeltetWB "WBEWB-WBmailWB" WBogWB WBhuskWB WBatWB
asjo@flora$


Mvh.

--
"I never get myself any dayjob Adam Sjøgren
Don't have to show myself what I am made of" asjo@koldfront.dk

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

Månedens bedste
Årets bedste
Sidste års bedste