我一直在使用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中找到负面预测的好文档。
答案 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。