Guffa | Foto | Programmering

RegExp del 3 - loopa sökresultat

RegExp kan ju användas för att söka och ersätta saker i en sträng. Ifall man vill göra lite mer avancerade saker med det man hittar i strängen så kan man få ut resultatet av en sökning som en samling av matchningar, och använda det för att göra något med det man hittade.

Som exempel ska vi göra en kodsnutt som gör om allting som står mellan [v] och [/v] till versaler. Texten "Lite [v]versaler[/v], tack." blir alltså "Lite VERSALER, tack.".

Det vi kommer att göra är att söka efter [v]någonting[/v] i strängen, och plocka ut det som en samling matchningar. Sedan loopar vi igenom matchningarna och lägger resultatet i en ny sträng.

Vi börjar med strängen som vi vill arbeta med:

strText = "Lite [v]versaler[/v], tack."

Sökningen ser ut så här:

' skapa ett RegExp-objekt
Set objRE = New RegExp
' ställ in sökning efter "[v]någonting[/v]"
objRE.Pattern = "\[v\][\w\W]+?\[/v\]"
' sätt icke skiftlägeskänslig (så att den hittar [V] också)
objRE.IgnoreCase = True
' sätt global sökning, så att den hittar alla, inte bara första
objRE.Global = True
' sök och lägg samlingen i objMatches
Set objMatches = objRE.Execute(strText)
' ta bort RegExp-objektet
Set objRE = Nothing

Nu har vi allting som hittades i samlingen objMatches, bara att loopa igenom det:

' en sträng att lägga resultatet i
strResult = ""
' senaste tecknet som är flyttat till resultat-strängen
lngPos = 1
' loopa igenom sökresultatet
For each objMatch in objMatches
   ' kollar ifall det finns några tecken framför det hittade
   If objMatch.FirstIndex > lngPos Then
      ' kopiera texten till resultat-strängen
      strResult = strResult & Mid(strText, lngPos, objMatch.FirstIndex - lngPos + 1)
   End If
   ' plocka ut strängen som hittades
   strFound = objMatch

   ' --- här kan vi göra vad vi vill med strFound ---

   ' ta bort [v] och [/v]
   strFound = Mid(strFound,4,Len(strFound)-7)
   ' gör om till versaler
   strFound = UCase(strFound)

   ' -------------------

   ' lägg in det i resultat-strängen
   strResult = strResult & strFound
   ' uppdatera lngPos till var vi är någonstans
   lngPos = objMatch.FirstIndex + objMatch.Length + 1
Next
' lägg till texten som finns efter sista sökresultatet
strResult = strResult & Mid(strText, lngPos)

' skriv ut resultatet
Response.Write strResult

Den här koden fungerar bra som mall när du vill loopa igenom ett resultat. Genom att byta ut sökmönstret och koden som behandlar strFound så kan du göra ganska avancerade saker.

Ett exempel som gör om [n]rad 1;rad 2;rad 3[/n] till en numrerad lista:

Sökmönstret:

' sök efter [n]någonting[/n]
objRE.Pattern = "\[n\][\w\W]+?\[/n\]"

Koden som behandlar strFound:

   ' --- här kan vi göra vad vi vill med strFound ---

   ' ta bort [n] och [/n]
   strFound = Mid(strFound,4,Len(strFound) - 7)
   ' gör en numrerad lista
   strFound = "<ol><li>" & Replace(strFound, ";", "<li>") & "</ol>"

   ' -------------------

Göran Andersson