Заменить весь текст в текстовом файле с помощью регулярного выражения
У меня есть текстовый файл со следующим текстом
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 ответа:
Метод
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 - по предложению @PortlandRunnerPublic 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