Avatar billede susrn Nybegynder
29. december 2003 - 15:27 Der er 16 kommentarer og
1 løsning

filtrering af tekst

Jeg er ved at lave en function der skal filtrere strenge.
Der kan indgå to filtrerings tegn, ? og *
?: ét ukendt tegn
*: flere ukendte tegn
eks: ”jul”, ”gul”, ”sul” opfylder alle ?ul, og ”god jul” opfylder g*l

Men min funktion filtrerer ikke rigtigt hvis jeg har mere end én * involveret?

  short  left = 1, leftFilter = 1, len = 0;   
//left holder pos hvor langt filtreringen er nået i s, mens leftFilter holder samme for filtret
//len er længden af den del af filtret der ligger mellem de to tegn der nu undersøges
    String s = V;
    filter.Delete(1,1);
    s = s.LowerCase();
    filter = filter.LowerCase();

    do {
        short nextTegn = FindNextPos( filter.SubString(leftFilter+1, filter.Length() ) );
// FindNextPos  returnerer position på først fundne * ell. ? i den parameter overførte streng
        len = nextTegn;
//længden på filterstrengen indtil næste tegn
        if (nextTegn == 0){
          nextTegn = s.Length()+1;
          len = nextTegn;
        }
        else
          nextTegn += leftFilter;

        if ( filter[leftFilter] == '*')
        {
            if ( leftFilter == filter.Length() )
//* er sidste tegn i filtret
            {
              res = true;
              leftFilter += 1;
            }
            else
            {
                short temp = (s.SubString(left, s.Length())).Pos(filter.SubString(leftFilter+1, len-1));//nextTegn-1 ));
                res = ( temp > 0 );
                left      += (temp-1) + len-1; 
//left += position +længde
                leftFilter += (temp-1);
            }
        }
        else if ( filter[leftFilter] == '?')
        {
            res = ( s.SubString(left+1, len-1) == filter.SubString(leftFilter+1, len-1));
            left      += len;
            leftFilter += len;
        }
        else if ( filter[leftFilter] != NULL)
        {
            res = ( s.SubString(left, len) == filter.SubString(leftFilter, len ) );
            left      += len;
            leftFilter += len;
        }
    }while( leftFilter < filter.Length() && res );
Avatar billede arne_v Ekspert
29. december 2003 - 15:36 #1
Er der nogen speciel grund til at du vil kode det selv og ikke
finde noget eksisterende kode f.eks. regex kode til at lave den slags
matchning med.
Avatar billede susrn Nybegynder
29. december 2003 - 15:40 #2
jeg kender ikke noget eksisterende
Avatar billede arne_v Ekspert
29. december 2003 - 15:42 #3
Hvad compiler bruger du ?
Avatar billede susrn Nybegynder
29. december 2003 - 15:45 #4
jeg arbejder i c++ builder 6
Avatar billede arne_v Ekspert
29. december 2003 - 15:51 #5
Så skulle du have en regexp.h med en TRegexp klasse som skulle
kunne sådan noget.

Prøv og brug 5 minutter på at checke online hjælp på TRegexp.
Avatar billede susrn Nybegynder
29. december 2003 - 18:07 #6
jeg har nu brugt en time, uden resultat, jeg kan godt finde filen men ikke noget om at bruge den
Avatar billede arne_v Ekspert
29. december 2003 - 19:13 #7
Prøv at se det her simple eksempel (testet med BCB 5.5):

#include <iostream>

using namespace std;

#include <regexp.h>

bool match(const char *pat, const char *s)
{
    TRegexp *rx = new TRegexp(pat);
    size_t len = -1;
    rx->find(s, &len);
    return (len==strlen(s));
}

int main()
{
    cout << match("[a-z]ul", "jul") << endl;
    cout << match("[a-z]ul", "hjul") << endl;
    cout << match("g[a-z ]*ul", "jul") << endl;
    cout << match("g[a-z ]*ul", "god jul") << endl;
    return 0;
}
Avatar billede arne_v Ekspert
29. december 2003 - 19:23 #8
Det er ikke helt normale wildcards.

[a-z] betyder 1 tegn fra a-z

[a-z] betyder 1 eller flere tegn a-z

[a-z]* betyder 0 eller flere tegn a-z

Du har altså flere muligheder end ?* giver fordi du kan også angive
hvilke tegn der kan vælges imellem.
Avatar billede arne_v Ekspert
29. december 2003 - 19:24 #9
Den store fordel er dog at Borland har skrevet koden !
Avatar billede susrn Nybegynder
29. december 2003 - 21:56 #10
Ja, det er super Arne, jeg er bare træt af at jeg ikke kan finde klassen i hjælpen. Hvis du fandt noget online, vil jeg meget gerne have et link.
Og vil du have point, må du give et svar.
Avatar billede arne_v Ekspert
29. december 2003 - 22:51 #11
Jeg kigger lige efter et link !
Avatar billede arne_v Ekspert
29. december 2003 - 22:56 #12
Det er dælemen svært at finder noget.

Følgende eksempel er ret simpelt, men kommentarerne  kræver lidt
specielle sprog kundskaber:
  http://www11.plala.or.jp/studyhall/cpp/tregexp.html
:-)
Avatar billede arne_v Ekspert
29. december 2003 - 22:59 #13
http://www.aewnet.com/newsgroups/rnews.asp?newsid=99828&group=32

hævder at der er noget i:
  ($C++Builder)\Source\RTL\Source\PCRE
Avatar billede arne_v Ekspert
29. december 2003 - 23:01 #14
Men jeg kiggede bare i regexp.h og brugte den information - det var
helt lige ud af landevejen.

Jeg har dog den fordel at jeg kender regular expressions fra adskillige
andre sprog.
Avatar billede susrn Nybegynder
30. december 2003 - 08:33 #15
tak for links, jeg har set i regexp.h og ja det er ligetil, hvis altså man kender til at bruge [a-z] og det gjorde jeg ikke. Iøvrigt er det ikke a-z æøå er også med.
Avatar billede arne_v Ekspert
30. december 2003 - 10:20 #16
Det præcise sæt af legale karakterer kan du styre 100% med
regular expressions.
Avatar billede susrn Nybegynder
30. december 2003 - 11:14 #17
ja tak, nu har jeg fundet oversigt over syntaksen dertil
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