2011-06-21 31 views
0

我有我試圖使用VBScript來處理一個文本文件,它看起來像這樣:VBScript的正則表達式替換頭痛

111 , ,  ,Yes ,Yes 
222 , ,  ,Yes ,Yes 
333 , ,  ,Yes ,Yes 
444 , ,  ,Yes ,Yes 
555 , ,  ,Yes ,Yes 
666 , ,  ,Yes ,Yes 

我想是刪除回車和製表符,逗號和「是」 (或正則表達式「\ t,\ t,\ t \ t,是\ t,是」)給出此輸出:

('111','222','333','444',' 555' , '666')

我使用這個代碼:

Const ForReading = 1 
Const ForWriting = 2 

Set objFSO = CreateObject("Scripting.FileSystemObject") 
Set objFile = objFSO.OpenTextFile(filePath, ForReading) 

strText = objFile.ReadAll 
objFile.Close 
'chr(010) = line feed chr(013) = carriage return 
strNewText = Replace(strText, "\t,\t,\t\t,Yes\t,Yes" & chr(013) & chr(010), "','") 

Set objFile = objFSO.OpenTextFile(filePath, ForWriting) 
objFile.WriteLine strNewText 
objFile.Close 

然而,這並沒有給出所需的輸出,如果我將「」\ t,\ t,\ t \ t,是\ t,是「&」取出,它將刪除回車符,這很好但我還需要刪除逗號標籤和'yes',並在結尾處設置('開頭和')。我猜這是我用正則表達式的方式,但我沒有用太多的VBScript所以我不知道

回答

1

而是追捕你不想要的東西,這是更容易,更容易出錯專注於你想要的東西:

Dim sExp : sExp = "('111','222','333','444','555','666')" 
    Dim aLines : aLines = Array(_ 
     "111 , ,  ,Yes ,Yes" _ 
    , "222 , ,  ,Yes ,Yes" _ 
    , "333 , ,  ,Yes ,Yes" _ 
    , "444 , ,  ,Yes ,Yes" _ 
    , "555 , ,  ,Yes ,Yes" _ 
    , "666 , ,  ,Yes ,Yes" _ 
)  
    Dim sAll : sAll = Join(aLines, vbCrLf) 
    WScript.Echo sAll 
    Dim reCut : Set reCut = New RegExp 
    reCut.Global = True 
    reCut.MultiLine = True 
    reCut.Pattern = "^\d+" 
    Dim oMTS : Set oMTS = reCut.Execute(sAll) 
    If 0 = oMTS.Count Then 
    WScript.Echo "Bingo A!" 
    Else 
    ReDim aNums(oMTS.Count - 1) 
    Dim nI 
    For nI = 0 To UBound(aNums) 
     aNums(nI) = oMTS(nI).Value 
    Next 
    Dim sRes : sRes = "('" & Join(aNums, "','") & "')"  
    If sRes = sExp Then 
     WScript.Echo "QED:", sRes 
    Else 
     WScript.Echo "Bingo B!" 
    End If 
    End If 

輸出:

111 , ,  ,Yes ,Yes 
222 , ,  ,Yes ,Yes 
333 , ,  ,Yes ,Yes 
444 , ,  ,Yes ,Yes 
555 , ,  ,Yes ,Yes 
666 , ,  ,Yes ,Yes 
QED: ('111','222','333','444','555','666') 

註釋:

我使用一個數組來構建我的字符串過程(全部)。您的字符串(strText) 來自文件。所以:

Dim sAll : sAll = Join(aLines, vbCrLf) 
    ==> 
    Dim sAll : sAll = objFile.ReadAll 

該字符串由正則表達式(重新切割)解析,其圖案^\ d +看起來 爲數字序列(+)(\ d)在啓動(^)(不是 整個字符串;這就是爲什麼MultiLine屬性設置爲True)。 .Execute的結果是匹配集合(oMTS),包含匹配。

爲了使預期結果的連接更加容易,將匹配的 值複製到數組(aNums)。

"('" & Join(aNums, "','") & "')"表達結合使用分離器陣列的 元件''(組合子?) - 來完成的結果, 我們只需要一個合適的頭( ' RESP尾。')

+0

QED !!! :)這樣做的夢幻般的方式,我根本不明白的代碼 - 你可以添加另一行顯示我的文本文件到數組中? –

+0

當我嘗試編寫輸出時,出現錯誤數量的參數錯誤?使用這行代碼: 'strNewText =替換(sAll,sRes)' –

+0

替換需要3個參數(請參閱您自己的代碼)。但是我沒有看到這個操作的任何理由 - 如果你想將結果寫入文件,只需執行「objFile.WriteLine sRes」。 –

0

試試這個

(.*?)(?:\s*,){3}Yes\s*,Yes\r? 

你需要採取的換行符的照顧,與Regexr \r很好。我把換行符放到正則表達式中,因爲我希望事後使用?。否則,如果最後一行不以換行符結束,則不會被替換。

'$1', 

這裏代替它,你將在年底得到一個額外的逗號。我目前不確定如何處理這個問題。

$1是第一個捕獲組的內容,在您的情況下,第一個逗號之前的部分應該在其中。

看到它here on Regexr

+0

感謝您回覆'strNewText = Replace(strText,「(。*?)(?:\ s *,){3}是\ s *,是\ r?」,「','」)'doesn' t似乎對文件進行了任何更改? –

+0

@ 4rd2,你必須用''1','替換,但是如果它什麼都不做,它就不會匹配。嘗試用'\ r \ n'或'\ n'替換'\ r'以匹配正確的換行符。 – stema