2014-05-20 97 views
5

在文本文件中的所有文本我有一個文本文件,下面的文本替換使用正則表達式

 
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

我認爲這是確定基本上刪除該文件並重新它還是需要它來對同一文件進行操作? –

+0

這不是一個關鍵的事情......我可以做 –

+0

對於那些與正則表達式相比較少的文本到列可能會更方便。 – pnuts

回答

3

regex.Replace方法應該做的伎倆。

獨立的模式成組這樣的:"(.*?)(\[)([^]]+)(\])(.*?)"

現在你可以更換這是在這種情況下,三場小組匹配組的輸入字符串:objRegEx.Replace(strText, "$3")


這裏是一個helpful link到Excel中正則表達式的不同示例。

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 
+0

謝謝你,但我發現了一個更快的方式來做到這一點。 –

+1

試着將你的文本行設置爲:objRegEx.Replace(strText,「」)'然後你不需要'objRegMC'。這是[鏈接](http:// stackoverflow。com/q/22542834/2521004),它使用類似的正則表達式替換原始Excel單元格。 –

+0

@PortlandRunner - 使用替換,我結束了替換所需的子字符串。 –

0

OK ...找到一種方法來做到這一點(由於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 
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)) 
+0

個人我會擴大這個更易讀,所以它更容易理解,維護並從中學習。除此之外,還有一個由OP提供的文本格式的簡單解決方案。 –

+0

@PortlandRunner謝謝你! :)我必須承認,由於正則表達式可以讓我的大腦悸動,所以我發現了一些非常不尋常的格式來操縱文本。 – Rich

+0

@Rich - 不錯的一個......但我想用正則表達式,因爲我的實際問題有點複雜。我發佈了我的測試代碼和數據,以獲得SO社區的一些見解。 –