10. september 2002 - 07:46 Der er 10 kommentarer og
1 løsning

Én regexp der matcher et ord men ikke et andet.

Konkret må ordet "Netscape" ikke findes i strengen hvorimod ordet "Gecko" skal være der. Jeg bruger Perl.
Avatar billede limemedia Nybegynder
10. september 2002 - 07:58 #1
hvis du pakker det ind i en if sætning, kan du lave ala
if ($str =~ /gecko/i) && ($str =~ /^netscape/i) {
    #code goes here
}

koden ikke testet
Avatar billede limemedia Nybegynder
10. september 2002 - 07:58 #2
rettere
if ($str =~ /gecko/i) && ($str !~ /netscape/i) {
    #code goes here
}
10. september 2002 - 08:03 #3
I spørgsmålet har jeg skrevet "Én" og så er det selvfølgelig én regexp/streng jeg ønsker og ikke en if sætning:)
Avatar billede limemedia Nybegynder
10. september 2002 - 08:06 #4
undskyld da :)) jeg overvejer blot hvad der vil være hurtigere ... hmm
Avatar billede kennie_nm Nybegynder
16. oktober 2002 - 12:12 #5
/(netscape){0}gecko(netscape){0}/

vil matche gecko i strenge uden netscape før eller efter
16. oktober 2002 - 19:23 #6
Nu har jeg testet det med nedstående. Det ser dog ikke ud til at virke. Bare der står "gecko" i sætningen går den igennem, og den er altså ligeglad om der står netscape eller ej. Resultatet står til sidst:

my @strs=("netscape gecko","netscape","gecko","netscapegecko","gecko netscape","gecko gecko","netscape netscape gecko","gecko gecko netscape");

foreach my $str (@strs)
{
    print "Tester $str...";
   
    if ($str=~/(netscape){0}gecko(netscape){0}/)
    {
        print "passed";
    }
    else
    {
        print "failed";
    }
    print "\n";
}


Resultat:

Tester netscape gecko...passed
Tester netscape...failed
Tester gecko...passed
Tester netscapegecko...passed
Tester gecko netscape...passed
Tester gecko gecko...passed
Tester netscape netscape gecko...passed
Tester gecko gecko netscape...passed
Avatar billede kennie_nm Nybegynder
16. oktober 2002 - 23:39 #7
nej, det virker naturligvis ikke... af flere grunde, bl.a. matcher /netscape{0}/ strengen 'netscape', hvilket er en fjollet semantik for mig.

Jo mere jeg tænker over det, jo mere overbevist bliver jeg om at if sætningen ovenfor nok er den eneste mulighed
Avatar billede kennie_nm Nybegynder
02. november 2002 - 21:04 #8
nu har jeg tænkt længe over det. Det er ikke muligt at udtrykke dit ønske i et enkelt regulært udtryk. Det er grammatikken simpelthen ikke stærk nok til.
Avatar billede iqzero Nybegynder
07. januar 2003 - 14:14 #9
Hvis du blot ønsker at teste hvorvidt gecko er der og netscape ikke er der, eller ej (TRUE/FALSE) så kan det da godt lade sig gøre med lidt legen. Til gengæld kan du ikke just få en brugbar streng ud af det.. ;)

Eksemplet er i PHP, men du kan nok se meningen i det.

--KODE--
/*FALSE*/
$str="netscape gecko";

/*FALSE*/
//$str="gecko netscape";

/*TRUE*/
//$str="gecko hej";

/*TRUE*/
//$str="hej gecko";

$pattern="/\A(?(?![a-z\ ]*netscape[a-z\ ]*)[a-z\ ]*gecko[a-z\ ]*)/";

preg_match($pattern,$str,$matches);

if(!$matches[0]) {
  echo("FALSE");
} else {
  echo("TRUE");
}
--/kode--

Altså et lookahead conditional assertion.
15. januar 2003 - 07:48 #10
>>igzero: Det virker ikke det du har skrevet. Jeg har testet det af med følgende kode i perl:

my @strs=("netscape gecko","netscape","gecko","netscapegecko","gecko netscape","gecko gecko","netscape netscape gecko","gecko gecko netscape");

foreach my $str (@strs)
{
    print "Tester $str...";
   
    if ($str=~/\A(?(?![a-z\ ]*netscape[a-z\ ]*)[a-z\ ]*gecko[a-z\ ]*)/)
    {
        print "passed: $1 $2 $3";
    }
    else
    {
        print "failed: $1 $2 $3";
    }
    print "\n";
}

Har du testet om det faktisk virker i PHP? Perl godkender samtlige testsætninger og returnerer ingen ting i subexp $1,$2 og $3. Jeg har aldrig før set at subexps kan være inden i hinanden, og måske er det den syntax perl ikke kan bruge til noget?
17. januar 2003 - 07:39 #11
Jeg giver kennie_nm ret i at det ikke kan lade sig gøre.
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