替换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 Ticket= 'Y032231'; 更新TABLEX SET Status='1',其中Ticket='Y157019';更新TABLEX SET Status='2',其中Ticket='Y013759';更新TABLEX SET Status='5',其中Ticket='Y032231';替换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
我尝试使用
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
循环中运行它,这样性能增益肯定会丢失。