替换VBScript/ASP Classic中的字符串

替换VBScript/ASP Classic中的字符串,vbscript,asp-classic,Vbscript,Asp Classic,我在ASP Classic/VBScript中有以下字符串: Y157019=1&Y013759=2&Y032231=5 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 Ticke

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

Y157019=1&Y013759=2&Y032231=5 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'; 更新TABLEX SET Status='1',其中Ticket='Y157019';更新TABLEX SET Status='2',其中Ticket='Y013759';更新TABLEX SET Status='5',其中Ticket='Y032231';
我尝试使用
Replace()
,但无法使其工作,因为字符串中的值位于名称之后。

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

输出:

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 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 cscript 31453580.vbs 更新TABLEX SET Status='1',其中Ticket='Y157019';更新TABLEX SET Status='2',其中Ticket='Y013759';更新TABLEX SET Status='5',其中Ticket='Y032231'; 更新TABLEX SET Status='1',其中Ticket='Y157019';更新TABLEX SET Status='2',其中Ticket='Y013759';更新TABLEX SET Status='5',其中Ticket='Y032231'; 符合事实的 适应更改的规格:

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='$2' WHERE Ticket= '$1'")
        Next
        sAct = Join(aTmp, "; ") & ";"
    Else
        sAct = "no match"
    End If
    WScript.Echo sAct
Next
选项显式
尺寸aTests:aTests=数组(_
“Y157019=1&Y013759=2&Y032231=5”_
,“Y157019=1和Y013759=2”_
,“Y157019=1”_
, "" _
)
Dim reRpl:Set reRpl=New RegExp
reRpl.Global=True
reRpl.Pattern=“([^=]+)=(\d+)”
暗信
对于ATEST中的每个sInp
WScript.Echo“----”,sInp
Dim oMts:Set oMts=reRpl.Execute(sInp)
暗sAct
如果0
输出:

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 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 cscript 31453580-2.vbs ----Y157019=1&Y013759=2&Y032231=5 更新TABLEX SET Status='1',其中Ticket='Y157019';更新TABLEX SET Status='2',其中票证='&Y013759';更新TABLEX SET Status='5',其中票证='&Y032231'; ----Y157019=1和Y013759=2 更新TABLEX SET Status='1',其中Ticket='Y157019';更新TABLEX SET Status='2',其中票证='&Y013759'; ----Y157019=1 更新TABLEX SET Status='1',其中Ticket='Y157019'; ---- 没有对手
使用正则表达式将输入(sInp)拆分为键值部分,并将这些部分替换为从所需输出(sExp)派生的模板(sTmpl):

输出:

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 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 cscript 31453580.vbs 更新TABLEX SET Status='1',其中Ticket='Y157019';更新TABLEX SET Status='2',其中Ticket='Y013759';更新TABLEX SET Status='5',其中Ticket='Y032231'; 更新TABLEX SET Status='1',其中Ticket='Y157019';更新TABLEX SET Status='2',其中Ticket='Y013759';更新TABLEX SET Status='5',其中Ticket='Y032231'; 符合事实的 适应更改的规格:

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='$2' WHERE Ticket= '$1'")
        Next
        sAct = Join(aTmp, "; ") & ";"
    Else
        sAct = "no match"
    End If
    WScript.Echo sAct
Next
选项显式
尺寸aTests:aTests=数组(_
“Y157019=1&Y013759=2&Y032231=5”_
,“Y157019=1和Y013759=2”_
,“Y157019=1”_
, "" _
)
Dim reRpl:Set reRpl=New RegExp
reRpl.Global=True
reRpl.Pattern=“([^=]+)=(\d+)”
暗信
对于ATEST中的每个sInp
WScript.Echo“----”,sInp
Dim oMts:Set oMts=reRpl.Execute(sInp)
暗sAct
如果0
输出:

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 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 cscript 31453580-2.vbs ----Y157019=1&Y013759=2&Y032231=5 更新TABLEX SET Status='1',其中Ticket='Y157019';更新TABLEX SET Status='2',其中票证='&Y013759';更新TABLEX SET Status='5',其中票证='&Y032231'; ----Y157019=1和Y013759=2 更新TABLEX SET Status='1',其中Ticket='Y157019';更新TABLEX SET Status='2',其中票证='&Y013759'; ----Y157019=1 更新TABLEX SET Status='1',其中Ticket='Y157019'; ---- 没有对手 您可以
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
您可以
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

什么是
Y157019=1&Y013759=2&Y032231=5
?这不是一个脚本。它是我在一个
请求后拥有的字符串。表单
Y157019=1&Y013759=2&Y032231=5
是什么?这不是脚本。这是我在
请求后得到的字符串。Form
感谢您的回复,@Ekkehard,很抱歉一开始没有说出来。但在我的示例中,我有3个字段,但在实际情况下可能是
0或N
。很好,但您必须在
For
循环中运行它,这样性能增益肯定会丢失。感谢您的回复,@Ekkehard,很抱歉起初没有说出来。但在我的示例中,我有3个字段,但在实际情况中可能是
0或N
。很好,但您必须在
For
循环中运行它,这样性能增益肯定会丢失。