【问题标题】:Replace string in VBScript/ASP Classic在 VBScript/ASP Classic 中替换字符串
【发布时间】:2015-07-16 12:01:13
【问题描述】:

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

Y157019=1&Y013759=2&Y032231=5

我想将字符串修改为:

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

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

【问题讨论】:

  • 什么是Y157019=1&Y013759=2&Y032231=5?那不是脚本。
  • 这是我在Request.Form之后的字符串

标签: vbscript asp-classic


【解决方案1】:

您可以将您的字符串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

【讨论】:

    【解决方案2】:

    使用 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='$2' WHERE Ticket= '$1'" _
                , "Update TABLEX SET Status='$4' WHERE Ticket= '$3'" _
                , "Update TABLEX SET Status='$6' WHERE Ticket= '$5';" _
    ), "; ")
    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 更新 TABLEX SET Status='1' WHERE Ticket='Y157019';更新 TABLEX SET Status='2' WHERE Ticket='Y013759';更新 TABLEX SET Status='5' WHERE Ticket='Y032231'; 更新 TABLEX SET Status='1' WHERE Ticket='Y157019';更新 TABLEX SET Status='2' WHERE Ticket='Y013759';更新 TABLEX SET Status='5' WHERE 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
    

    输出:

    cscript 31453580-2.vbs ---- Y157019=1&Y013759=2&Y032231=5 更新 TABLEX SET Status='1' WHERE Ticket='Y157019';更新 TABLEX SET Status='2' WHERE Ticket='&Y013759';更新 TABLEX SET Status='5' WHERE Ticket='&Y032231'; ---- Y157019=1&Y013759=2 更新 TABLEX SET Status='1' WHERE Ticket='Y157019';更新 TABLEX SET Status='2' WHERE Ticket='&Y013759'; ---- Y157019=1 更新 TABLEX SET Status='1' WHERE Ticket='Y157019'; ---- 不匹配

    【讨论】:

    • 感谢@Ekkehard 的回复,很抱歉一开始没有说出来。但在我的示例中,我有 3 个字段,但在实际情况下可能是 0 or N
    • 很好,但是无论如何你必须在For 循环中运行它有什么意义,所以性能增益肯定会丢失。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多