使用正则表达式替换文本文件中的所有文本

时间:2014-05-20 17:35:43

标签: excel vba excel-vba vbscript

我有一个包含以下文字的文字文件

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并仅使用所需文本保存文件。

4 个答案:

答案 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