Avatar billede svinth Nybegynder
09. oktober 2002 - 07:51 Der er 16 kommentarer og
1 løsning

regex hjælp søges

Hej RegEx'ere.

Jeg har i et script udtrykket:

s-^(.*[^\\])$-$1\\-o;  # ensure path ends with a backslash

Men som jeg læser det, så står der:

find intet eller noget tekst i starten af strengen, dernæst et backslash og konkatener yderligere et backslash på enden af denne streng.
Mit gæt ville have været at man kun skulle konkatenere et backslash, hvis der ikke allerede var et!?
Hvad står der i virkeligheden i udtrykket?

M.v.h. Svante
Avatar billede jespernaur Nybegynder
09. oktober 2002 - 08:02 #1
Eftersom der står [^\\] er der tale om en negeret tegnklasse, altså alt bortset fra backslash. Der står altså i virkeligheden: Find intet eller noget tekst, dernæst en ikke-backslash, og konkatener en backslash på den fundne streng. Den finder altså alt til og med sidste forekomst af en ikke-backslash
Avatar billede svinth Nybegynder
09. oktober 2002 - 08:12 #2
Aaaahhhh!
Jeg læste det som at \\skulle optræde i starten af indholdet af den karakterklasse den er en del af! Men det skal den jo implicit, ^ betyder vel altid i starten af strengen! Med mindre at der optræder \n og den slags specialtilfælde :).
Takker!
M.v.h. Svinth
Avatar billede erikjacobsen Ekspert
09. oktober 2002 - 09:27 #3
Der er også andre måder et gøre det på, naturligvis, som kan være
mere eller mindre forståelige. fx:

$s="svante";
$s=~s/^(.*?)\\?$/$1\\/;

Eller mere ligefrem:

$s="svante";
if ($s!~/\\$/) { $s.="\\"; }

...mange veje fører til Rom...
Avatar billede svinth Nybegynder
09. oktober 2002 - 13:24 #4
Hej Erik!

Godt at se at du stadig styrer det meste! :).
Dog er jeg mig lidt over det første ? i:

$s=~s/^(.*?)\\?$/$1\\/;

Er det ikke en fejl? Altså decideret ulovligt?

M.v.h. Svante
Avatar billede erikjacobsen Ekspert
09. oktober 2002 - 13:28 #5
nej. Hvis du tænke på .*? så betyder det sidste ? blot at
den ikke skal være grådig. Ellers går det galt.
Avatar billede svinth Nybegynder
09. oktober 2002 - 13:33 #6
* og ? er jo såkaldte 'quantifiers', vil det sige at en 'quantifier' kan tage
en anden 'quantifier' som input.
Og hvordan kan det gå galt!?
Avatar billede erikjacobsen Ekspert
09. oktober 2002 - 13:40 #7
Så'n en * er grådig. Så .* vil tage den sidste \ med.
Altså fordi den er optional:  \\? Ikke grådig .*?
tager kun så meget der er nødvendigt. Øh - sådan ca...
Avatar billede svinth Nybegynder
09. oktober 2002 - 13:51 #8
Ok, på den måde.
Som udgangspunkt søger disse udtryk netop at finde så meget som muligt...
Vil sige at .*? er et fast udtryk, eller kan ? også bruges til eksempelvis:

.+?

M.v.h. Svante

PS: Jeg har også lige fundet *? i et andet udtryk:

if ($P=~/\\?([^\\]*?)(\.[^\\\.]*)?$/o)

Spændende :).
Avatar billede erikjacobsen Ekspert
09. oktober 2002 - 13:55 #9
Ja, også til ".+?"  og hvad som helst i stedet for "."

Gå ind på http://www.perldoc.com/perl5.6/pod/perlre.html#Extended-Patterns
og led efter første forekomst af "greedy"
Avatar billede erikjacobsen Ekspert
09. oktober 2002 - 13:55 #10
Avatar billede svinth Nybegynder
09. oktober 2002 - 13:58 #11
Ah, det var et afsnit jeg ikke har fået læst endnu.
Jeg har i øvrigt bemærket at de fleste herinde linker til 5.6 istedet for 5.8 :).
Takker!

Svante
Avatar billede erikjacobsen Ekspert
09. oktober 2002 - 14:05 #12
Det er vel hvad vi har i vores bogmærker ... Lige her er
der vist ingen forskel.
Avatar billede svinth Nybegynder
09. oktober 2002 - 14:10 #13
...forresten, jeg har et spørgsmål til forståelsen af:

if ($P=~/\\?([^\\]*?)(\.[^\\\.]*)?$/o)

Jeg læser det som:

måske et \
Dernæst et antal ikke \
måske efterfulgt af
- et .
- et antal (måske 0) ikke \ og .

Eksempelvis: fsdfer.e.t.r.

Svante
Avatar billede svinth Nybegynder
09. oktober 2002 - 14:13 #14
Ah, mit eksempel kan vist udvides til:

sdfsdgsg.sdfsdf.dsfsdf

da:

- et antal (måske 0) ikke \ og .

skal laves om til:

- et antal (måske 0) ikke \ eller .

Svante
Avatar billede erikjacobsen Ekspert
09. oktober 2002 - 14:24 #15
Det udtryk ser for kompliceret ud. Hvad skal det kunne?
Avatar billede svinth Nybegynder
09. oktober 2002 - 14:29 #16
Det skal finde basedelen af en fil i et stinavn, altså filnavn uden extension, og returnere det i $1:

        if ($P=~/\\?([^\\]*?)(\.[^\\\.]*)?$/o) {
            return $1;

Jeg har ikke skrevet det, og da jeg er nybegynder har jeg svært ved at vurdere om der findes en bedre fremgangsmåde.

Svante
Avatar billede erikjacobsen Ekspert
09. oktober 2002 - 14:48 #17
Ok - det er vist rigtigt nok - det kan ikke gøres nemmere.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester