2016-04-01 111 views
1

我有一個文件「D:\ test.log」,它有兩種風格之一。如果用戶離線當用戶接收到的消息,這將出現:清理日誌文件中的行

[2點19分47秒]兄弟Aimbot(adama900):(已保存的星期四03月31日5點15分09秒2016)這是一個測試線

這將是這樣,如果用戶在線時用戶接收的消息:

[2點19分47秒]兄弟Aimbot(adama900):這是一個測試線

,我想這是什麼做的是切出多餘的部分,以便它看起來像這樣,如果它是第一或第二風格:

兄弟Aimbot(adama900)這是一個測試線

然後將其放入消息框中。

這裏是我的代碼:

Sub main() 
    filename = "D:\Test.txt" 
    Set fso = CreateObject("Scripting.FileSystemObject") 
    Set f = fso.OpenTextFile(filename) 
    LNEVAL = f.ReadLine 
    LNENUM = 0 

    Do Until f.AtEndOfStream 
    For i = 1 To LNENUMs 
     f.ReadLine 
    Next 

    If InStr(LNEVAL, "(S") Then 
     LNEVAL = Left(LNEVAL, (Len("(S")+4)) 
     MsgBox = LNEVAL 
    End If 
    Loop 

    f.Close 
End Sub 

這是我到目前爲止所。

回答

0

通過regular expression更換,您可以非常簡單地完成所需工作。基本上你想要做的是從每行取出三件事情:

  • 從字符串的開頭方括號中的子串,
  • 結腸從消息分離的名稱,
  • 可選該冒號後的括號之間的子串。

正則表達式^\[.*?\]與字符串開頭的開頭方括號和截至方括號的最短字符數匹配。

一個正則表達式\(Saved.*?\)匹配開括號後跟字Saved和最短的字符數直到右括號。但是,由於此部分是可選的,因此您需要通過將表達式置於非捕獲組並將?修飾符添加到它((?:...)?)來指示該表達式可以出現零次或一次。

把那你想在括號中保存創建捕獲組

^\[.*?\] (.*?): (?:\(Saved.*?\))?(.*) 

replace與剛剛捕獲的組,每個組匹配行子匹配:

Set re = New RegExp 
re.Pattern = ... 

Set f = fso.OpenTextFile(filename) 
Do Until f.AtEndOfStream 
    MsgBox re.Replace(f.ReadLine, "$1 $2") 
Loop 
f.Close 

上的一些評論您現有的代碼:

  • For i = 1 To LNENUMs:因爲您將LNEUMs設置爲0,所以此循環總是被跳過。由於您只在For循環內執行f.ReadLine,所以外部Do循環變成無限循環,因爲您從不將文件讀到最後。
  • Len("(S")+4始終計算爲6,因爲字符串(S的長度不會更改,因此您可以用數字值替換表達式。
  • MsgBox = LNEVALMsgBox功能不起作用。刪除函數名稱和消息之間的=