用正则expression式replace文本文件中的所有文本

我有一个带有以下文本的文本文件

 161624.406:发送:[sometext1]
 161624.437:发送:[sometext2]
 161624.468:发送:[sometext3]
 161624.499:发送:[sometext4]
 161624.531:发送:[sometext5]

我只想保留该文件中的文本部分。 所需的输出是

 sometext1
 sometext2
 sometext3
 sometext4
 sometext5

我在Excel-VBA中使用以下代码

Public Sub testa() a = "C:\Users\pankaj.jaju\Desktop\test.log" Set objFSO = CreateObject("Scripting.FileSystemObject") Set objTxtFile = objFSO.OpenTextFile(a, 1) strText = objTxtFile.ReadAll objTxtFile.Close Set objTxtFile = Nothing Set objRegEx = CreateObject("VBScript.RegExp") With objRegEx .Global = True .MultiLine = True .Pattern = "\[([^]]+)\]" Set objRegMC = .Execute(strText) b = objRegMC(0).SubMatches(0) End With Set objRegEx = Nothing Debug.Print b End Sub 

问题是输出仅显示为sometext1 。 如何在文本文件中replace全部文件,并仅用所需文本保存文件。

regex.Replace方法应该做的伎俩。

将你的模式分成这样的组: "(.*?)(\[)([^]]+)(\])(.*?)"

现在,你可以用这个例子中的匹配组replace你的inputstring: objRegEx.Replace(strText, "$3")


这里是一个有用的链接到Excel中的正则expression式的不同例子。

我知道你已经得到了你的答案。 但是对于这样简单的程序,为什么还要使用正则expression式呢? 这是一个4行脚本,可以做同样的事情 – 是的,它已经过testing。

 Dim a, text: a = "C:\testenv\test.log" text = split(CreateObject("Scripting.FileSystemObject").OpenTextFile(a, 1).ReadAll, vbcrlf) for i=0 to ubound(text) : text(i) = replace(split(text(i), "[")(1), "]", "") : next CreateObject("Scripting.FileSystemObject").OpenTextFile(a, 2).Write(Join(text, vbcrlf)) 

正则expression式显然只抓住了string的第一个匹配。 我没有足够的正则expression式来提出一个仅考虑正则expression式的解决scheme

一个简单的解决方法是使用objTxtFile.ReadLine而不是ReadAll

逐一读取每个string,应用正则expression式并获得输出。

 Public Sub testa() a = "C:\Users\pankaj.jaju\Desktop\test.log" Set objFSO = CreateObject("Scripting.FileSystemObject") Set objTxtFile = objFSO.OpenTextFile(a, 1) Do Until (objTxtFile.AtEndOfStream) 'Loop till EOF strText = objTxtFile.ReadLine 'Single line read instead of ReadAll Set objRegex = CreateObject("VBScript.RegExp") With objRegex .Global = True .MultiLine = True .Pattern = "\[([^]]+)\]" Set objRegMC = .Execute(strText) b = objRegMC(0).SubMatches(0) End With Set objRegex = Nothing Debug.Print b 'replace this with the code to output the string where you want etc Loop objTxtFile.Close End Sub 

好的…find了一个方法来做到这一点(感谢MSDN …有时文档是有用的:-))。 分享答案

 Public Sub testa() a = "C:\Users\pankaj.jaju\Desktop\test.log" Set objFSO = CreateObject("Scripting.FileSystemObject") Set objTxtFile = objFSO.OpenTextFile(a, 1) strText = objTxtFile.ReadAll objTxtFile.Close Set objTxtFile = Nothing b = "" Set objRegEx = CreateObject("VBScript.RegExp") With objRegEx .Global = True .MultiLine = True .Pattern = "\[([^]]+)\]" Set objMatches = .Execute(strText) For Each Match In objMatches For Each SubMatch In Match.SubMatches b = b & SubMatch & vbCrLf Next SubMatch Next Match End With Set objRegEx = Nothing Set objTxtFile = objFSO.OpenTextFile(a, 2) objTxtFile.Write b objTxtFile.Close Set objTxtFile = Nothing End Sub 

编辑 – 基于@ PortlandRunner的build议

 Public Sub testa() a = "C:\Users\pankaj.jaju\Desktop\test.log" Set objFSO = CreateObject("Scripting.FileSystemObject") Set objTxtFile = objFSO.OpenTextFile(a, 1) strText = objTxtFile.ReadAll objTxtFile.Close Set objTxtFile = Nothing b = "" Set objRegEx = CreateObject("VBScript.RegExp") With objRegEx .Global = True .MultiLine = True .Pattern = "(.*?)(\[)([^]]+)(\])(.*?)" b = objRegEx.Replace(strText, "$3") End With Set objRegEx = Nothing Set objTxtFile = objFSO.OpenTextFile(a, 2) objTxtFile.Write b objTxtFile.Close Set objTxtFile = Nothing End Sub