Search code examples
regexvbscriptasp-classic

Find '~XX~' within a string with specific values


I have classic ASP written in VBScript. I have a record pulled from SQL Server and the data is a string. In this string, I need to find text enclosed in ~12345~ and I need to replace with very specific text. Example 1 would be replaced with M, 2 would be replaced with A. I then need to display this on the web page. We don't know how many items will be enclosed with ~.

Example Data:

Group Pref: (To be paid through WIT)
~2.5~ % Quarterly Rebate - Standard Commercial Water Heaters

Display on webpage after:

Group Pref: (To be paid through WIT)
~A.H~ % Quarterly Rebate - Standard Commercial Water Heaters

I tried this following, but there are two many cases and this would be unrealistic to maintain. I does replace the text and display correctly.

dim strSearchThis
strSearchThis =(rsResults("PREF"))
set re = New RegExp

with re
    .global = true
    .pattern = "~[^>]*~"
    strSearchThis = .replace(strSearchThis, "X")
end with

I am also trying this code, I can find the text contained between each ~ ~, but when displayed its the information between the ~ ~ is not changed:

dim strSearchThis
strSearchThis =(rsResults("PREF"))

Set FolioPrefData = New RegExp
FolioPrefData.Pattern = "~[^>]*~"
FolioPrefData.Global = True 
FolioPrefData.IgnoreCase = True

'will contain all found instances of ~ ~'
set colmatches = FolioPrefData.Execute(strSearchThis)

Dim itemLength, found

For Each objMatch in colMatches
    Select Case found
        Case "~"
        'ignore - doing nothing'
         Case "1"
         found = replace(strSearchThis, "M")

    End Select
Next
response.write(strSearchThis)

Solution

  • You can do it without using Regular Expressions, just checking the individual characters and writing a function that handles the different cases you have. The following function finds your delimited text and loops through all characters, calling the ReplaceCharacter function defined further down:

    Function FixString(p_sSearchString) As String
        Dim iStartIndex
        Dim iEndIndex
        Dim iIndex
        Dim sReplaceString
        Dim sReturnString
    
        sReturnString = p_sSearchString
    
        ' Locate start ~
        iStartIndex = InStr(sReturnString, "~")
    
        Do While iStartIndex > 0
    
            ' Look for end ~
            iEndIndex = InStr(iStartIndex + 1, sReturnString, "~")
    
            If iEndIndex > 0 Then
    
                sReplaceString = ""
    
                ' Loop htrough all charatcers
                For iIndex = iStartIndex + 1 To iEndIndex - 1
                    sReplaceString = sReplaceString & ReplaceCharacter(Mid(sReturnString, iIndex, 1))
                Next
    
                ' Replace string
                sReturnString = Left(sReturnString, iStartIndex) & sReplaceString & Mid(sReturnString, iEndIndex)
    
                ' Locate next ~
                iStartIndex = InStr(iEndIndex + 1, sReturnString, "~")
    
            Else
                ' End couldn't be found, exit
                Exit Do
            End If
    
        Loop
    
        FixString = sReturnString
    
    End Function
    

    This is the function where you will enter the different character substitutions you might have:

    Function ReplaceCharacter(p_sCharacter) As String
        Select Case p_sCharacter
            Case "1"
                ReplaceCharacter = "M"
            Case "2"
                ReplaceCharacter = "A"
            Case Else
                ReplaceCharacter = p_sCharacter
        End Select
    
    End Function
    

    You can use this in your existing code:

    response.write(FixString(strSearchThis))