2016-11-30 41 views
1

我試圖使用正則表達式從文本文件中刪除整行(包括斷行)。使用正則表達式排除VBS中的整行

這是我的代碼:

Do Until objFileToRead1.AtEndOfStream 
    nline = objFileToRead1.ReadLine() 
    regEx.Pattern = ".*to " 
    nline = regEx.Replace(nline, "") 
    objFileToRead2.WriteLine nline 
Loop 

這是罰款和工作正常。 所以,如果我的文本文件包含:

 
hahahaha to 
hehehehe to hihihihi 
hohohoho to 

它變成:

 
(blank line) 
hehehehe to hihihihi 
(blank line)` 

不過,我不希望空白等。我已經嘗試過使用regEx.Pattern = ".*to \r\n",但似乎來自正則表達式的\r\n不工作,每次我嘗試運行腳本時,它都不會刪除任何內容(因爲搜索沒有找到任何內容)。還嘗試用括號和括號封裝表達式,但沒有運氣。

有任何提示?

+0

這是否意味着您的'nline'在匹配時爲空?在寫入文件之前檢查它 - '如果Len(nline)> 0然後objFileToRead2.WriteLine nline' –

+0

@WiktorStribiżew實際上我試圖用'to來代替以'nothing'結尾的每一行,意思是行應該被刪除而不是保持空白。 – Adami

+0

請閱讀下面的解決方案。問題是,你仍然用'.WriteLine'寫出空行。 –

回答

3

ReadLine讀取流中的下一行。結果不包含換行符,因此您的正則表達式沒有\r\n匹配。

爲了防止輸出中出現空行,當nline爲空時,請不要致電WriteLine。或者,就你的情況而言,只有當它與你的正則表達式模式不匹配時,纔會將該行寫入輸出。

這裏是我會做什麼:

Set regEx = New RegExp 
regEx.Pattern = "to \S+" 

Do Until objFileToRead1.AtEndOfStream 
    line = objFileToRead1.ReadLine 
    If Not regEx.Test(line) Then objFileToRead2.WriteLine line 
Loop 

其它注意事項:

  • 沒有必要保留重新定義在循環的正則表達式。
  • 既然你似乎在尋找一個固定的字符串,正則表達式可能沒有必要。你可以使用InStr() function來做到這一點。對於大型輸入文件,會有性能優勢。
+0

你的模式會匹配(因此跳過)「hehehehe to hihihihi」。 –

+0

你說得對。根據OP的原始正則表達式修復。 – Tomalak

+0

嗨,我已經根據@ Ekkehard.Horner的答案進行了編碼。最後代碼變得和你的答案几乎一樣。不管怎麼說,還是要謝謝你!! – Adami

3

nline = objFileToRead1.ReadLine() 

nline不包含尾隨vbCrLf RESP。 \ r \ n,因此您的新RegExp無法匹配。

如果只想線路用一些有趣的「來」,只是.WriteLine到輸出文件只有nline匹配「 \ S + $」之前(以,一個空格,一個或多個非whilespaces後然後結束)。 I.E .:忘記替換。

+0

謝謝,這啓發了我。我必須將正則表達式調整爲「to \ S +」,因爲在該行結束之前有更多的文本。 – Adami