正则表达式替换VB脚本中的模式

时间:2015-05-26 06:02:10

标签: regex vbscript expression

我正在尝试在VB脚本中编写正则表达式来替换某些模式。

我的字符串可能包含零个或多个以下模式 -

&USERID
&USERID
&USERID.
&USERID.
&USERID(n)
&USERID(n)
&USERID(n).
&USERID(n).
&USERID(n1, n2)
&USERID(n1, n2)
&USERID(n1, n2).
&USERID(n1, n2).

示例字符串 -

C:\temp\&USERID_&USERID._&USERID(4)_&USERID(2,2)..txt

如果USERID = ABCDEF,那么一旦替换,结果字符串应该看起来像 -

C:\temp\ABCDEF_ABCDEF_ABCD_BC.txt

括号中的数字表示要替换的字符数。可以使用逗号分隔的数字指定范围。为了达到这个目的,我写了一个正则表达式如下 -

"((&USERID\(\d+,\d+\)\.)|(&USERID\(\d+,\d+\)\.)|(&USERID\(\d+,\d+\))|(&USERID\(\d+,\d+\)))|((&USERID\(\d\)\.)|(&USERID\(\d\)\.)|(&USERID\(\d\))|(&USERID\(\d\))|(&USERID\.)|(&USERID\.))"

使用VBScript.RegExp我匹配模式并获得匹配的集合。迭代每个匹配对象,我替换完整的USERID或部分基于下标。

正则表达式工作正常。但是与字符串操作功能相比它非常慢。

可以优化上述模式吗?

更新

我接受了解决我的一个问题的答案。基于正则表达式,我尝试解决另一个查找和替换问题,如下所示 -

我有以下模式

DATE
DATE(MMDDYYYY)
DATE(DDMMYYYY)
DATE(YYYYMMDD)
DATE(YYYY)
DATE(MM)
DATE(DD)
DATE(DDMONYYYY)
DATE(MON)
DATE(MONTH)
DATE(YYDDD)
DATE(YYYYDDD)

它可能有一个终止"。"最后。

Function replaceDate(matchString, label, position, sourceString)
If label = "MMDDYYYY" or label = "" then
    replaceDate = "<MMDDYYYY>"
ElseIf label = "DDMMYYYY" then 
    replaceDate = "<DDMMYYYY>"
ElseIf label = "YYYYMMDD" then 
    replaceDate = "<YYYYMMDD>"
ElseIf label = "YYYY" then 
    replaceDate = "<YYYY>"
ElseIf label = "MM" then 
    replaceDate = "<MM>"
ElseIf label = "DD" then 
    replaceDate = "<DD>"
ElseIf label = "DDMONYYYY" then 
    replaceDate = "<DDMONYYYY>"
ElseIf label = "MON" then 
    replaceDate = "<MON>"
ElseIf label = "MONTH" then 
    replaceDate = "<MONTH>"
ElseIf label = "YYDD" then 
    replaceDate = "<YYYYDDD>"
Else
    replaceDate = ""
end if  
End Function


With new RegExp
    .Global = True 
    .IgnoreCase = False
    .Pattern =  "(?:&(?:amp;)?)?DATE(?:\((MMDDYYYY|DDMMYYYY|YYYYMMDD|YYYY|MM|DD|DDMONYYYY|MON|MONTH|YYDDD|YYYYDDD)?\))?\.?"
    strTempValue = .Replace(strTempValue, GetRef("replaceDate"))
End with

1 个答案:

答案 0 :(得分:1)

如果没有更多数据,则测试起来并不容易,但如果效果更好,则可以尝试

Dim USERID
    USERID = "ABCDEF"

Dim originalString    
    originalString = "C:\temp\&USERID_&amp;USERID._&USERID(4)_&USERID(2,2)..txt"

Dim convertedString

    Function replaceUSERID(matchString, n1, n2, position, sourceString)
        n1 = CLng("0" & Trim(n1))
        n2 = CLng("0" & Trim(Replace(n2, ",", "")))
        If n1 < 1 Then 
            replaceUSERID = USERID
        ElseIf n2 > 0 Then 
            replaceUSERID = Mid(USERID, n1, n2)
        Else 
            replaceUSERID = Left(USERID, n1)
        End If 
    End Function 

    With New RegExp
        .Pattern = "(?:&(?:amp;)?)?USERID(?:\((\s*\d+\s*)(,\s*\d+\s*)?\))?\.?"
        .Global = True 
        .IgnoreCase = False
        convertedString = .Replace(originalString, GetRef("replaceUSERID"))
    End With 

    WScript.Echo originalString
    WScript.Echo convertedString

对于多个&#34;标签&#34;替换

Option Explicit

Dim dicLabels
    Set dicLabels = WScript.CreateObject("Scripting.Dictionary")

    With dicLabels
        .Add "USERID", "ABCDEF"
        .Add "LUSER", "ABCDEF"
        .Add "ID", "GHIJKL"
    End With

Dim originalString    
    originalString = "C:\temp\&USERID_&amp;USERID._&USERID(4)_&USERID(2,2)_ID(2,3)_&amp;LUSER..txt"

Dim convertedString

    Function replaceLabels(matchString, label, n1, n2, position, sourceString)
        If Not dicLabels.Exists(label) Then 
            replaceLabels = matchString
        Else 
            n1 = CLng("0" & Trim(n1))
            n2 = CLng("0" & Trim(Replace(n2,",","")))
            replaceLabels = dicLabels.Item(label)
            If n1 > 0 Then 
                If n2 > 0 Then 
                    replaceLabels = Mid(dicLabels.Item(label), n1, n2)
                Else 
                    replaceLabels = Left(dicLabels.Item(label), n1)
                End If 
            End If
        End If
    End Function 

    With New RegExp
        .Pattern = "(?:&(?:amp;)?)?("& Join(dicLabels.Keys, "|") &")(?:\((\s*\d+\s*)(,\s*\d+\s*)?\))?\.?"
        .Global = True 
        .IgnoreCase = False
        convertedString = .Replace(originalString, GetRef("replaceLabels"))
    End With 

    WScript.Echo originalString
    WScript.Echo convertedString