我有一个包含以下文字的文字文件
161624.406 : Send:[sometext1] 161624.437 : Send:[sometext2] 161624.468 : Send:[sometext3] 161624.499 : Send:[sometext4] 161624.531 : Send:[sometext5]
我只想在该文件中保留 sometext 部分。期望的输出是
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 。如何在文本文件中ReplaceAll
并仅使用所需文本保存文件。
答案 0 :(得分:3)
regex.Replace
方法应该可以解决问题。
将您的模式分成如下组:"(.*?)(\[)([^]]+)(\])(.*?)"
现在,您可以使用匹配组替换输入字符串,在这种情况下为第3组:objRegEx.Replace(strText, "$3")
以下是Excel中不同Regex示例的helpful link。
答案 1 :(得分:2)
我知道你已经得到了答案。但对于像这样的简单程序,为什么甚至使用正则表达式?这是一个可以做同样事情的4行脚本 - 是的,它已经过测试。
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))
答案 2 :(得分:0)
正则表达式显然只抓住了字符串的第一个匹配。我对正则表达式不够熟练,只想出一个考虑\n
一个简单的解决方法是使用objTxtFile.ReadLine
代替ReadAll
逐个读取每个字符串,应用正则表达式并获取输出。
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
答案 3 :(得分:0)
好的......找到了办法(感谢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的建议
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