替换 VBScript/ASP 经典中的字符串

Replace string in VBScript/ASP Classic

我在 ASP Classic/VBScript 中有以下字符串:

Y157019=1&Y013759=2&Y032231=5

我想将字符串修改为:

Update TABLEX SET Status='1' WHERE Ticket= 'Y157019'; Update TABLEX SET Status='2' WHERE Ticket= 'Y013759'; Update TABLEX SET Status='5' WHERE Ticket= 'Y032231';

我尝试使用 Replace() 但无法正常工作,因为字符串中的值在名称之后。

使用 RegExp 将您的输入 (sInp) 拆分为键值部分,然后将这些部分替换为从您所需的输出 (sExp) 派生的模板 (sTmpl):

Option Explicit

'                        1       2 3       4 5       6
Dim sInp  : sInp      = "Y157019=1&Y013759=2&Y032231=5"
Dim sExp  : sExp      = "Update TABLEX SET Status='1' WHERE Ticket= 'Y157019'; Update TABLEX SET Status='2' WHERE Ticket= 'Y013759'; Update TABLEX SET Status='5' WHERE Ticket= 'Y032231';"
Dim sTmpl : sTmpl     = Join(Array( _
              "Update TABLEX SET Status='' WHERE Ticket= ''" _
            , "Update TABLEX SET Status='' WHERE Ticket= ''" _
            , "Update TABLEX SET Status='' WHERE Ticket= '';" _
), "; ")
Dim reRpl : Set reRpl = New RegExp
reRpl.Pattern = "^([^=]+)=(\d+)&([^=]+)=(\d+)&([^=]+)=(\d+)$"
Dim sAct : sAct = reRpl.Replace(sInp, sTmpl)
WScript.Echo sExp
WScript.Echo sAct
WScript.Echo CStr(sAct = sExp)

输出:

cscript 31453580.vbs
Update TABLEX SET Status='1' WHERE Ticket= 'Y157019'; Update TABLEX SET Status='2' WHERE Ticket= 'Y013759'; Update TABLEX SET Status='5' WHERE Ticket= 'Y032231';
Update TABLEX SET Status='1' WHERE Ticket= 'Y157019'; Update TABLEX SET Status='2' WHERE Ticket= 'Y013759'; Update TABLEX SET Status='5' WHERE Ticket= 'Y032231';
True

适应更改后的规范:

Option Explicit

Dim aTests : aTests = Array( _
    "Y157019=1&Y013759=2&Y032231=5" _
  , "Y157019=1&Y013759=2" _
  , "Y157019=1" _
  , "" _
)
Dim reRpl : Set reRpl = New RegExp
reRpl.Global  = True
reRpl.Pattern = "([^=]+)=(\d+)"

Dim sInp
For Each sInp In aTests
    WScript.Echo "----", sInp
    Dim oMts : Set oMts = reRpl.Execute(sInp)
    Dim sAct
    If 0 < oMts.Count Then
        ReDim aTmp(oMTS.Count - 1)
        Dim i
        For i = 0 To UBound(aTmp)
            aTmp(i) = reRpl.Replace(oMTS(i).Value, "Update TABLEX SET Status='' WHERE Ticket= ''")
        Next
        sAct = Join(aTmp, "; ") & ";"
    Else
        sAct = "no match"
    End If
    WScript.Echo sAct
Next

输出:

cscript 31453580-2.vbs
---- Y157019=1&Y013759=2&Y032231=5
Update TABLEX SET Status='1' WHERE Ticket= 'Y157019'; Update TABLEX SET Status='2' WHERE Ticket= '&Y013759'; Update TABLEX SET Status='5' WHERE Ticket= '&Y032231';
---- Y157019=1&Y013759=2
Update TABLEX SET Status='1' WHERE Ticket= 'Y157019'; Update TABLEX SET Status='2' WHERE Ticket= '&Y013759';
---- Y157019=1
Update TABLEX SET Status='1' WHERE Ticket= 'Y157019';
----
no match

您可以 Split() 将您的字符串放入 key=value 对的数组中,然后进一步 Split() 对以单独提取键和值。

例如:

Const FIELDS = "Y157019=1&Y013759=2&Y032231=5"

a = Split(FIELDS, "&")
s = ""

For Each kv In a
    If InStr(kv, "=") > 0 Then
        k = Split(kv, "=")(0)
        v = Split(kv, "=")(1)
        s = s & "Update TABLEX SET Status='" & v & "' WHERE Ticket= '" & k & "'; "
    End If
Next

WScript.Echo s