如何在VBScript中使用正则表达式替换子字符串的一部分?

时间:2018-10-22 09:40:29

标签: regex vbscript

我正在逐行读取VbScript中的文本文件,并将每次的值存储在一个名为line_text的变量中。

The line_text variable can take values as
":60F:C180235P56987456"
":60M:C184535P56987456"
":60F:D182335P56987456"
":60M:D180278P56987456"

根据我的解决方案,我使用了以下四个正则表达式:

Set fso = CreateObject(“Scripting.FileSystemObject”)
Set objFileToRead=fso.OpenTextFile("C:\New\maddy.txt",1) 
Set objFileToWrite=fso.OpenTextFile("C:\New\maddy1.txt",2,true) 

Dim line_text
Set re1 = New RegExp
re1.Pattern = "(:60F:C)\d{6}"

Set re2 = New RegExp
re2.Pattern = "(:60M:C)\d{6}"

Set re3 = New RegExp
re3.Pattern = "(:60F:D)\d{6}"

Set re4 = New RegExp
re4.Pattern = "(:60M:D)\d{6}"

patt1=":60F:C120412"
patt2=":60M:C120412"
patt3=":60F:D120412"
patt4=":60M:D120412"

do until objFileToRead.AtEndOfStream Then
    line_text = objFileToRead.ReadLine()
    If re1.test(line_text) Then
        line_text=re1.replace(line_text,patt1)
    ElseIf re2.test(line_text) Then
        line_text=re2.replace(line_text,patt2)
    ElseIf re3.test(line_text) Then
        line_text=re3.replace(line_text,patt3)
    ElseIf re4.test(line_text) Then
        line_text=re4.replace(line_text,patt4)
    End If

    objFileToWrite.Write(line_text)
Loop
Set objFileToRead = Nothing
Set objFileToWrite = Nothing

由于我想用相同的字符串“ 120412”替换子字符串中的六个数字和一个字符,因此在不使用我使用的四个不同表达式的情况下,进行替换的最佳方法是什么。这非常耗时。

VBScript中是否有可用的分组工具,因此我可以在一个表达式中对所有行读取操作的那六个数字进行分组,并在重复时用相同的表达式“ 120412”替换所有这些数字。

1 个答案:

答案 0 :(得分:1)

您可以使用单个模式:

:60([FM]):([CD])\d{6}

并使用单个替换模式替换:

:60$1:$2120412

请参见regex demo

详细信息

  • :60-文字:60子字符串
  • ([FM])-捕获组1:FM
  • :-冒号
  • ([CD])-捕获第2组:CD
  • \d{6}-六位数。

$1代表捕获组1中捕获的值,$2是占位符,其中包含捕获组2中捕获的文本。

VB脚本测试:

Dim s As String
Dim regex As Object

s = ":60F:C180235P56987456" & vbCrLf & ":60M:C184535P56987456" & vbCrLf & ":60F:D182335P56987456" & vbCrLf & ":60M:D180278P56987456"
Set regex = CreateObject("VBScript.RegExp")
With regex
  .Pattern = ":60([FM]):([CD])\d{6}"
  .Global = True
End With

wscript.echo regex.Replace(s, ":60$1:$2120412")

输出:

:60F:C120412P56987456
:60M:C120412P56987456
:60F:D120412P56987456
:60M:D120412P56987456