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

How to substitute part of substring using regex in 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”替换所有数字。

您可以使用单一模式:

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

并替换为单个替换模式:

:60:20412

regex demo

详情

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

</code> 代表捕获组 1 中捕获的值,<code> 是包含捕获组 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:20412")

输出:

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