Заменить весь текст в текстовом файле с помощью регулярного выражения


У меня есть текстовый файл со следующим текстом

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:Userspankaj.jajuDesktoptest.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 5

4 ответа:

Метод regex.Replace должен сделать трюк.

Разделите свой шаблон на группы следующим образом: "(.*?)(\[)([^]]+)(\])(.*?)"

И теперь вы можете заменить входную строку соответствующей группой, которая в данном случае является третьей группой: objRegEx.Replace(strText, "$3")


Вот полезная ссылка на различные примеры регулярных выражений в Excel.

Я знаю, что вы уже получили свой ответ. Но для такой простой программы, как эта, зачем вообще использовать регулярные выражения? Вот 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))

Регулярное выражение, очевидно, захватывает только первое совпадение строки. Я недостаточно хорошо разбираюсь в регулярных выражениях, чтобы придумать решение только для регулярных выражений, которое учитывает \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

Хорошо ... нашел способ это сделать (Спасибо 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


EDIT - по предложению @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