使用VBS Regex查找前一行中的数据

时间:2018-02-16 18:09:05

标签: regex vbscript wsh

我一直在使用VBS修改的文件(感兴趣的人的ANSI 837文件)。其中一个修改要求我找到文件中较早的日期,并且我试图避免为了获得日期而遍历每一行。

该文件看起来大致如此。

CLM*12345~

DTP*434*RD8*20170101-20170101

*Numerous other lines*

SV2*WXYZ*HC:1234567~

SVD*WXYZ*HC:1234567~

SV2*WXYZ*HC:1234567~

SVD*WXYZ*HC:1234567~

CLM*456789~

DTP*434*RD8*20180101-20180101

*Numerous other lines*

SV2*ABCDE*HC:1234567~

SVD*ABCDE*HC:1234567~

SV2*ABCDE*HC:1234567~

SVD*ABCDE*HC:1234567~

例如,如果最近的SV2*ABCDE行中的日期是2018年,我可能会将SV2*EFGHI的所有实例替换为DTP*434。如果我执行VBS正则表达式通过"DTP*434*RD8*2018"寻找SV2*ABCDE,如下所示:

(DTP\*434\*RD8\*)(.*)(~[\s\S]*?SV2\*)

然后我从文件中获取第一行DTP而不是最近的行。由于VBS不支持lookbehind,我还尝试编写只有在CLM*DTP*434行之间没有遇到SV2时匹配的内容,但我似乎无法做出消极的前瞻工作,也无法在VBS中找到负面预测的好文档。

1 个答案:

答案 0 :(得分:1)

用于查找不包含其他字符串的字符串的VBS RegExp模板模板通常如下所示:

beginning(?:(?!excluding)[\s\S])*?ending

如果最近的SV2*ABCDE行中的日期是2018年(假设有SV2*EFGHI,则您可以尝试以下代码将DTP*434的所有实例替换为source.txt Unicode中的result.txt个文本文件:

Dim sContent, sReplace

sContent = ReadTextFile("C:\test\source.txt", -1)

With CreateObject("VBScript.RegExp")
    .Global = False
    .Multiline = True
    .IgnoreCase = True
    .Pattern = "(DTP\*434\*RD8\*2018\d{4}-2018\d{4}(?:(?!DTP\*434\*RD8\*)[\s\S])*?SV2\*)ABCDE(\*)"
    Do
        sReplace = .Replace(sContent, "$1EFGHI$2")
        If sReplace = sContent Then Exit Do
        sContent = sReplace
    Loop
End With

WriteTextFile sReplace, "C:\test\result.txt", -1

Function ReadTextFile(sPath, lFormat)
    ' lFormat -2 - System default, -1 - Unicode, 0 - ASCII
    With CreateObject("Scripting.FileSystemObject").OpenTextFile(sPath, 1, False, lFormat)
        ReadTextFile = ""
        If Not .AtEndOfStream Then ReadTextFile = .ReadAll
        .Close
    End With
End Function

Sub WriteTextFile(sContent, sPath, lFormat)
    ' lFormat -2 - System default, -1 - Unicode, 0 - ASCII
    With CreateObject("Scripting.FileSystemObject").OpenTextFile(sPath, 2, True, lFormat)
        .Write sContent
        .Close
    End With
End Sub

这些链接可能会有所帮助:MSDN Introduction to Regular Expressions (JavaScript)RegexBuddy VBScript’s Regular Expression Support