Avatar billede nikrasitf Nybegynder
17. december 2002 - 13:29 Der er 17 kommentarer og
2 løsninger

RegExp Search

Hvis jeg f.eks har en text bestående af 3 linier...

ostepops
gifgaf
ostepips
ostehest

og jeg vil søge på det første som starter med "oste",
men ikke slutter med pops, hvordan kunne jeg så gøre det?

"oste[^p]" <-- Starter med oste men må ikke have p lige efter, dvs den finder ostehest

Troede at man bare kunne lave en "oste[^pops]", men selvfølgelig efter lidt mere læsning
fandt jeg ud af det betyder at hverken p, o eller s må komme lige efter...

Jeg vil så tro at det er noget i stil med "oste[^p][^o][^p][^s]", men hver af not-ledene bliver
jo tolket for sig :(  Men syntes ikke lige jeg kan finde nogle form for AND/&&/& imellem ledene.

p.s: Skal bruges til søgning i en editor jeg har gang i, og det ville være perfekt med sådanne statements..

mvh
Nikolaj Rasmussen
Avatar billede erikjacobsen Ekspert
17. december 2002 - 13:33 #1
det må du gøre af to omgange

  if ( matcher("^oste") && !matcher("pops$") ) ...

(pseudo.syntaks)
Avatar billede nikrasitf Nybegynder
17. december 2002 - 13:41 #2
Jeg har en funktion som resultere positionen på det første stykke
tekst den finder som matcher med den aktuelle RegExp som man har givet,
så det ville nok være lidt svært med ovenstående.

Plus at det så heller ikke ville være særlig dynamisk, da alle RegExp's gerne skulle virke.
Avatar billede rygter Nybegynder
19. december 2002 - 12:24 #3
skriv lige hvad sprog du bruger..
Avatar billede nikrasitf Nybegynder
19. december 2002 - 12:29 #4
øh.. jeg bruger til dette projekt delphi (dvs pascal),
men hvad har det med sagen at gøre?

Alle regexp's skal jo kunne fyres af...
Avatar billede nikrasitf Nybegynder
19. december 2002 - 12:31 #5
Kan sagtens lave noget kode selv som have den funktionalitet, men så ville muligheden for RegExp ligesom ryge sig en tur.
Avatar billede kastermester Nybegynder
22. december 2002 - 11:43 #6
oste([^p][^o][^p][^s])virker det ikke?
Avatar billede kastermester Nybegynder
22. december 2002 - 11:49 #7
Ney, sådan her, godt nok er det php kode men det er vel til at oversætte:

<?php
    $array = array("ostepops",
                  "gifgaf",
                  "ostepips",
                  "ostehest");
    foreach($array as $str){
        if(preg_match("/^oste/i", $str) && !preg_match("/pops$/i", $str)){
            echo $str . "<br>";
        }
    }
?>

Det gav dette resultat:

ostepips
ostehest
Avatar billede iqzero Nybegynder
30. december 2002 - 11:25 #8
I PERL kompatible regex er det sådan her (her er det lige et eksempl i PHP)

<?php
$str="ostepops
gifgaf
ostepiPs
ostehest";

preg_match("/^oste(?im)(?!pops)[a-z]*/",$str,$matches);

foreach($matches as $match) {
  echo $match;
}
?>
Avatar billede nikrasitf Nybegynder
07. januar 2003 - 10:29 #9
Korrekt, men begge eksempler er jo ikke ren RegExp for hele strengen.
Kode-stump dur ikke, da man kan lave mange andre RegExp som f.eks
"indhold Ostepips, men IKKE gifgaf". Så blev man nødt til at lave endnu en kodestump osv osv...

For som jeg sagde tidligere:
>Kommentar: nikrasitf
>19/12-2002 12:31:11   
>Kan sagtens lave noget kode selv som have den funktionalitet,
>men så ville muligheden for RegExp ligesom ryge sig en tur.
Avatar billede iqzero Nybegynder
07. januar 2003 - 12:13 #10
Du må meget gerne udspecificere det lidt, jeg forstår ikke helt hvad du mener. I det eksempel jeg skriver, sker der tre ting:

1. Definer teksten du vil søge i.
2. Definer regular expression.
3. Output resultat.

Hvor meget vil du have trimmer væk?
Avatar billede nikrasitf Nybegynder
09. januar 2003 - 11:35 #11
Jo selvfølgelig...
Jeg har en RegExp-komponent som jeg giver en RegExp-sætning, og derefter giver
den teksten som jeg vil søge i.

Rent funktionalt starter den fra starten af teksten og hopper en character
frem indtil at RegExp'en er valid på den aktuelle position.

Så ved teksten "ostepops gifgaf ostepips" vil jeg have en RegExp som siger...
Giv mig positionen på det første tekststykke som starter med "oste" men <u>ikke</u> har pops efterfølgende. Dvs den skulle så finde ostepips istedet for.

Prøvede lige "/^oste(?im)(?!pops)[a-z]*/" men den er desværre ikke valid, faktisk springer komponenten i luften og bitcher over syntax-error.
Avatar billede iqzero Nybegynder
09. januar 2003 - 13:47 #12
Hvilket programmeringssprog arbejder du med, og hvilken funktion bruger du?

Den RegExp er ganske valid, og virker - jeg har selv testet den. Den er bare i PCRE - Perl Compatible Regular Expression. De fleste programmeringssprog har en funktion som kan tolke PCRE.
Avatar billede nikrasitf Nybegynder
09. januar 2003 - 14:25 #13
I mit eksempel er det en komponent til delphi, men har samme funktionalitet
med den tilsvarende komponent til c++ builder.

De påstår at den supportere alle officelle former for RegExp, så kan det
tænkes at Perl har udvidet funktions-arkivet?
Avatar billede nikrasitf Nybegynder
09. januar 2003 - 14:28 #14
Fandt DIPcre, som har en anden delphi komponent. Kan være den forstår det ;)
Avatar billede _darkstar_ Nybegynder
09. januar 2003 - 14:29 #15
I perl hedder det

/^oste(?!pops)/

Se også http://www.perldoc.com/perl5.6/pod/perlre.html

Det kaldes på en "zero-width look ahead expression".
Avatar billede _darkstar_ Nybegynder
09. januar 2003 - 14:30 #16
I pascal skal du bare fjerne de to slashes. Så bliver det altså til

/^oste(?!pops)/
Avatar billede iqzero Nybegynder
09. januar 2003 - 14:57 #17
lookahead assertion. :)

Og du mener nok

^oste(?!pops)
Avatar billede nikrasitf Nybegynder
09. januar 2003 - 15:20 #18
Super najs... er dog "oste(?!pops)" med den såkaldte DIPcre-delphi-komponent

Tnx 2 ya both...
Avatar billede nikrasitf Nybegynder
10. januar 2003 - 14:58 #19
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