Avatar billede axkris Nybegynder
25. august 2005 - 15:37 Der er 8 kommentarer og
2 løsninger

Funktion: Tælle forekomster i streng?

Hej alle

Findes der ikke en smart funktion, som kan returnere antallet af en bestemt forekomst i en streng?

F.eks. tælle hvor mange gange tegnet "|" forekommer i en værdi (streng).

I så fald at den ikke allerede findes, kan du så ikke skabe en til mig?

På forhånd tak :-)
Avatar billede busschou Praktikant
25. august 2005 - 15:41 #1
tja du kan splitte den og så få størrelsen
tekst = "noget med | af og til |"
tekstArr = split(tekst,"|")
antalForekomster = ubound(tekstArr)+1
Avatar billede kjulius Novice
25. august 2005 - 23:48 #2
Du kan bruge en funktion som:

Function NbrOfString(SearchFor As String, SearchIn As String) As Integer
Dim Nbr As Integer
Dim i As Integer
Nbr = 0
If SearchFor <> "" Then
    Do
        i = InStr(i + 1, SearchIn, SearchFor)
        If i > 0 Then Nbr = Nbr + 1
    Loop Until i = 0 Or i = Len(SearchIn)
End If
NbrOfString = Nbr
End Function
Avatar billede busschou Praktikant
26. august 2005 - 07:33 #3
kjulius >> det her er asp og ikke asp.net ;o)
Men man kan selvfølgelig gøre tilsvarende, men hvorfor bruge 12 linjers kode når 3 er nok ;o)
Avatar billede kjulius Novice
26. august 2005 - 08:23 #4
busschou-->: Du mener fordi parametrene er typecastede? axkris spurgte efter en funktion. Men okay, du har selvfølgelig ret. VBScript understøtter ikke typecasting. Det var nu ikke asp+/asp.net kode, men bare en rutine fra alm. VBA (Access). Til brug i alm. ASP, bør det vel være:

Function NbrOfString(SearchFor, SearchIn As String)
Dim Nbr, i
Nbr = 0
If SearchFor <> "" Then
    Do
        i = InStr(i + 1, SearchIn, SearchFor)
        If i > 0 Then Nbr = Nbr + 1
    Loop Until i = 0 Or i = Len(SearchIn)
End If
NbrOfString = Nbr
End Function

Mht. antallet af linier, så har du formodentlig ret, men jeg har alligevel et par forbehold, jeg gerne vil indskyde:

1) Du har ikke defineret det som en funktion og heller ikke dim'et dine variable (som man altid bør - anvende Option Explicit - for at undgå problemer med variabler), så alene det vil bringe din kode op på flere linier.

2) Du har brugt funktionen Split, som kun tillader brugen at ét tegn, som den streng der skal tælles. Du kan altså ikke tælle alle forekomster af strengen "xyz".
Avatar billede axkris Nybegynder
26. august 2005 - 09:24 #5
Takker :-)
Avatar billede busschou Praktikant
26. august 2005 - 10:28 #6
kjulius >> ja jeg har ikke defineret det som en funktion da jeg mener det er overflødigt  at lave en funktion når der kun kræves i princippet en linje nemlig
antal = ubound(split(tekst,"|"))+1
Jeg er ikke enig at man altid bør Dim´e sine variable og benytte Option Explicit. Brugen af Option Explicit er 100% valgfri og er i mine øjne et værktøj man kan benytte hvis man føler behov for det, hvis man har meget kode. Jeg bruger det af og til, men finder det ikke altid nødvendig men det er selvfølgelig en smags sag :o)
Ligesom du pointerer at der blev bedt om en funktion, så kan jeg pointere for at der blev bedt om at tælle forekomsten af "|" hvorfor det er unødvendigt at gøre mere ud af det :o)
Anyway så kan jeg da igen lave det samme på een linje for "xyz" nemlig sådan her
antal = ubound(split(tekst,"xyz"))+1
Jeg kan ikke se i dokumentationen at der står noget om der _kun_ må være eet tegn omvendt kan jeg ikke se der står at der må være fler, jeg kan blot konstatere at det virker hos mig :o)
Avatar billede kjulius Novice
26. august 2005 - 22:24 #7
busschou--> Tja, tjo, jeg har godt nok ikke tjekket om Split funktionen også virker med længere strenge. Jeg kiggede i dokumentationen http://msdn.microsoft.com/library/en-us/script56/html/vsfctSplit.asp og lagde mærke til definitionen:

delimiter
Optional. String character used to identify substring limits.

Der står character - altså ental, så det troede jeg på! :-(

Din one-liner er da også meget smart, så hatten af for det! :-)
Avatar billede busschou Praktikant
27. august 2005 - 00:41 #8
kjulius >> kom selv lidt i tvivl da du skrev det, og kiggede selv samme sted og det er misvisende, underligt nok :o)
Avatar billede kjulius Novice
27. august 2005 - 02:17 #9
busschou--> Du bør da forøvrigt ikke addere 1 til din ubound. Det er jo ikke antallet af elementer strengen deles op i, men antallet af forekomster af søgestrengen, der skal returneres. Det bør da være

antal = ubound(split(tekst,"xyz"))

Er du ikke enig?
Avatar billede busschou Praktikant
27. august 2005 - 07:40 #10
jo
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