vbscript上的正则表达式

vbscript上的正则表达式,vbscript,Vbscript,我有这样一个日志文件: some strings... <FX> another strings... <FX> <TEG1> <TEG2> </TEG2> </TEG1> </FX> some strings... <FX> <FX> <TEG1> </TEG1> </FX> <FX>([\s\S]+?)</FX&g

我有这样一个日志文件:

some strings...
<FX>
another strings...
<FX>
 <TEG1>
  <TEG2>
  </TEG2>
 </TEG1>
</FX>
some strings...
<FX>
<FX>
 <TEG1>
 </TEG1>
</FX>
<FX>([\s\S]+?)</FX>
一些字符串。。。
另一个字符串。。。
一些字符串。。。
我需要对其进行解析并得到以下结果:

<FX>
 <TEG1>
  <TEG2>
  </TEG2>
 </TEG1>
</FX>


我已经写过这样的正则表达式:

some strings...
<FX>
another strings...
<FX>
 <TEG1>
  <TEG2>
  </TEG2>
 </TEG1>
</FX>
some strings...
<FX>
<FX>
 <TEG1>
 </TEG1>
</FX>
<FX>([\s\S]+?)</FX>
([\s\s]+?)
但它返回以下匹配项:

<FX>
another strings...
<FX>
 <TEG1>
  <TEG2>
  </TEG2>
 </TEG1>
</FX>

另一个字符串。。。


有人能帮我学习正则表达式吗?
提前感谢。

根据隐藏在“另一根弦”后面的内容,您可能会逃脱:

  Dim sAll : sAll = goFS.OpenTextFile("..\data\15168620.txt").ReadAll()
  WScript.Echo sAll
  WScript.Echo "--------"
  Dim reX  : Set reX = New RegExp
  reX.Global  = True
  reX.Pattern = "<FX>[\s\S]*?(<FX>[\s\S]+?</FX>)"
  Dim oMTS : Set oMTS = reX.Execute(sAll)
  Dim oMT
  For Each oMT in oMTS
      WScript.Echo oMT.SubMatches(0)
      WScript.Echo "--------"
  Next
Dim-sAll:sAll=goFS.OpenTextFile(“..\data\15168620.txt”).ReadAll()
WScript.Echo sAll
WScript.Echo“----------”
Dim reX:Set reX=新RegExp
reX.Global=True
reX.Pattern=“[\s\s]*?([\s\s]+?)”
Dim oMTS:Set oMTS=reX.Execute(sAll)
暗oMT
对于oMT中的每个oMT
WScript.Echo oMT.SubMatches(0)
WScript.Echo“----------”
下一个
输出:

some strings...
<FX>
another strings...
<FX>
 <TEG1>
  <TEG2>
  </TEG2>
 </TEG1>
</FX>
some strings...
<FX>
<FX>
 <TEG1>
 </TEG1>
</FX>

--------
<FX>
 <TEG1>
  <TEG2>
  </TEG2>
 </TEG1>
</FX>
--------
<FX>
 <TEG1>
 </TEG1>
</FX>
--------
<FX>
 <TEG1>
  <TEG2>
  </TEG2>
 </TEG1>
</FX>
--------
<FX>
 <TEG1>
 </TEG1>
</FX>
--------
一些字符串。。。
另一个字符串。。。
一些字符串。。。
--------
--------
--------
更新:

我仍然希望我们能够避免步行:

  Dim sAll : sAll = goFS.OpenTextFile("..\data\15168620-2.txt").ReadAll()
  WScript.Echo sAll
  WScript.Echo "--------"
  Dim aAll : aAll = Split(sAll, "FX>")
  Dim sTry
  For Each sTry In aAll
      If "</" = Right(sTry, 2) Then
         WScript.Echo "<FX>" & sTry & "FX>"
         WScript.Echo "--------"
      End If
  Next
Dim-sAll:sAll=goFS.OpenTextFile(“..\data\15168620-2.txt”).ReadAll()
WScript.Echo sAll
WScript.Echo“----------”
Dim aAll:aAll=拆分(全部,“FX>”)
朦胧
对于aAll中的每个sTry
如果“”
WScript.Echo“----------”
如果结束
下一个
输出:

some strings...
<FX>
another <FX> strings...
<FX><FX><FX><FX><FX>
<FX>
<FX>
 <TEG1>
  <TEG2>
  </TEG2>
 </TEG1>
</FX>
some strings...
<FX>
<FX>
 <TEG1>
 </TEG1>
</FX>

--------
<FX>
 <TEG1>
  <TEG2>
  </TEG2>
 </TEG1>
</FX>
--------
<FX>
 <TEG1>
 </TEG1>
</FX>
--------
一些字符串。。。
另一个字符串。。。
一些字符串。。。
--------
--------
--------
更新II:

行人进近-逐行阅读,在上开始新的采集,在
上处理/输出采集:

Dim alLines:Set alLines=CreateObject(“System.Collections.ArrayList”)
alLines.容量=500
Dim oTS:设置oTS=goFS.OpenTextFile(“..\data\15168620-2.txt”)
直到oTS.AtEndOfStream
尺寸sLine:sLine=oTS.Readline()
选择Case True
案例“”=左侧(sLine,4)
艾琳,明白了
艾琳,加入斯琳
案例“”=左侧(sLine,5)
艾琳,加入斯琳
Echo连接(alLines.ToArray(),vbCrLf)
WScript.Echo“----------”
其他情况
艾琳,加入斯琳
结束选择
环
加油,加油
输出:

some strings...
<FX>
another strings...
<FX>
 <TEG1>
  <TEG2>
  </TEG2>
 </TEG1>
</FX>
some strings...
<FX>
<FX>
 <TEG1>
 </TEG1>
</FX>

--------
<FX>
 <TEG1>
  <TEG2>
  </TEG2>
 </TEG1>
</FX>
--------
<FX>
 <TEG1>
 </TEG1>
</FX>
--------
<FX>
 <TEG1>
  <TEG2>
  </TEG2>
 </TEG1>
</FX>
--------
<FX>
 <TEG1>
 </TEG1>
</FX>
--------

--------
--------
这么大的文件(10GB),
RegExp
一文不值。这是我的想法

' StripInvalidXML.vbs
Option Explicit

Const ForReading = 1, ForWriting = 2, ForAppending = 8
Const TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0
Const TAG_OPEN = "<FX>", TAG_CLOSE = "</FX>"

Dim fso, fin, fout
Dim sLine, sBlock

Set fso  = CreateObject("Scripting.FileSystemObject")
Set fin  = fso.OpenTextFile("input_log.xml",  ForReading,  False)
Set fout = fso.OpenTextFile("output_log.xml", ForAppending, True)

Do Until fin.AtEndOfStream
    sLine = fin.ReadLine
    If sLine = TAG_OPEN Then
        sBlock = sLine
    Else
        sBlock = sBlock & sLine
    End If
    sBlock = sBlock & vbNewLine
    If sLine = TAG_CLOSE Then
        fout.WriteLine sBlock
    End If
Loop

fin.Close
fout.Close
“StripInvalidXML.vbs
选项显式
读取常数=1,写入常数=2,外观常数=8
常量TristateUseDefault=-2,TristateTrue=-1,TristateFalse=0
Const TAG_OPEN=“”,TAG_CLOSE=“”
尺寸fso、fin、fout
暗线
设置fso=CreateObject(“Scripting.FileSystemObject”)
设置fin=fso.OpenTextFile(“input_log.xml”,ForReading,False)
设置fout=fso.OpenTextFile(“output_log.xml”,ForAppending,True)
直到fin.AtEndOfStream
sLine=fin.ReadLine
如果sLine=TAG_打开,则
sBlock=sLine
其他的
sBlock=sBlock&sLine
如果结束
sBlock=sBlock&vbNewLine
如果sLine=TAG\u关闭,则
福特莱特林斯布洛克酒店
如果结束
环
结束
四、结束

为此,您可以尝试使用XML解析器而不是正则表达式。例如,在VBScript中,您可以使用
msxml
。@MaxiWheat-大小(10 GB)和数据格式不正确使得无法使用msxml。谢谢您的回复。你问了一个很好的问题“取决于你的“另一根弦”背后隐藏着什么”。有时我的“另一个字符串”可能包含许多打开的标记,有时它可能包含简单的文本,如“数据库中的错误…”。也许算法应该是这样的:在匹配字符串中找到“last”标记,并获取和标记之间的所有信息。但是它是如何用正则表达式写的——我不知道……谢谢你的帮助。我已经在我的示例中测试了它,它对我来说工作得很好,但是它如何在10 Gb大小的日志文件上工作(这就是我想要编写正则表达式的原因)?我将在周一的工作中测试它,并告诉你关于rezults的情况。否则,谢谢)@lurii-RegExp和Split()方法都不适合处理无法完全加载到内存中的文件。我们需要一个步行策略。