webForumDet fria alternativet

Regexp: hitta mönstret i en text genom keywords

Webbutveckling

4 svar · 935 visningar · startad av Carl Hungus

Medlem sedan apr. 20103 inlägg
Frågan#1

Hej!

Jag jobbar med sökalgoritmer till en VB/6 program. Programmet söker igenom websidor och returnerar en träff om ett sökord förekommer i texten. T ex om ordet "hamster" anges så kommer programmet ange träffar så fort ordet hamster förekommer, oavsett sammanhanget.

Nu är jag intresserad av att "sålla ut" websidor som specifikt handlar om hamstrar. Min ide är att hitta ett regexp-uttryck som ger träff om ordet hamster förekommer 3 gånger eller fler. Har försökt med:

hamster\w{3}
(hamster)\w{3,}

Fungerar dock inte. Tror jag är inne på fel spår. All hjälp mottages tacksamt!
Carl

Medlem sedan aug. 20039 340 inlägg
#2

Ett sätt kan vara att kolla på resultatet du får tillbaka (kanske en array?) och kolla hur många träffar du får. Annars kanske följande kan funka:

(hamster.*){3}

Felet du gör är att {3,} syftar till \w och inte hela uttrycket. Alltså, ordet hamster förljt av 3 eller fler "ord-tecken". (vilket är vad \w står för.)
hamsterxyz och hamsterxyzabc skulle båda matcha men inte hamster xyz eftersom ordet hamster följs av mellanslag som inte är ett "ord-tecken".

Mitt förslag sätter allt inom parenteser vilket gör att det som står inom parentesen eftersöks 3 gånger. .* betyder "matcha 0 eller flera valfria tecken". hamster.* matchar således hamster och hamsterxyz och hamster xyz.
Notera att du bara behöver söka efter tre träffar. Om det är allt du vill veta så behöver du ju inte söka efter en fjärde träff. (Spara lite CPU) Däremot om du vill få ut alla träffar eller veta att det inte finns mer än tre träffar behöver du ett mer avanncerat uttryck.

Jag skulle även vilja föreslå:

(hamst(er|rar).*){3}

...som söker efter tre förekomster av antingen hamster eller hamstrar. T ex hamsterhamsterhallonsylthamstrar eller hamster hamsterpaj något annat hamstrar. (er|rar) söker alltså efter en förekomst av antingen er eller rar.

Välkommen till webForum förresten. :)

Medlem sedan mars 20007 896 inlägg
#3

Frågan är om det ens går utan att upprepa mönstret - men varför göra det krångligt?

Dim myRegExp As RegExp
Dim myMatches As MatchCollection
Set myRegExp = New RegExp
myRegExp.IgnoreCase = True
myRegExp.Global = True
myRegExp.Pattern = "regex"
Set myMatches = myRegExp.Execute(subjectString)

If myMatches.Count > 2
    ' 3 or more matches
Else
    ' Nope
End If

Edit - Oj, vad seg jag var.

Medlem sedan apr. 20103 inlägg
#4

Tack! Tänk att det kunde vara så lätt!

Medlem sedan feb. 20041 816 inlägg
#5

@nitro2k01: Kanonbra svar och det förtjänar en :bire! (y)

282 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
142 ms — deklarationer (db)
0 ms — hämta statistik (cache)
137 ms — hämta tråd, inlägg och bilagor (db)
139 ms — ändringar (db)