2013-09-26 68 views
0

我有一個字符串,我試圖用VbCrLf替換所有的VbCr/VbLf。這是爲了颳去一些HTML。立即替換2個vbCrLf

我的代碼如下所示:

leHTML = leHTML.Replace(vbLf, vbCrLf) 
leHTML = leHTML.Replace(vbCr, vbCrLf) 

然而,在許多情況下,我然後用2X vbCrLf離開了,而我只想要1

leHTML = leHTML.Replace(vbCrLf & vbCrLf, vbCrLf) 

線之上似乎並不做任何事情。我如何用1x vbCrLf替換2個vbCrLf?有沒有更好的方法去「規範化」換行和回車?

+3

以這種方式使用Replace看起來不對。你的第一次調用用vbCrLf替換vbLf(兩個字符:一個vbCr和一個vbLf)。第二個替換找到由第一個替換插入的vbCr,將其刪除並再次添加兩個字符:vbCr e vbLf,因此您以vbCr + vbLf + vbLf序列結束。不好 – Steve

回答

1

你不應該更換正確vbCrLf在第一個地方。相反,只需替換那些需要更換的字符。這項任務的一個便利工具是一個正則表達式。

有要擺脫掉兩種情況:

  • VBCR沒有以下vbLf
    的正則表達式,這是(vbCr)(?!vbLf)
  • vbLf沒有前述VBCR
    的正則表達式,這是(?<!vbCr)(vbLf)

綜合起來,我們得到以下正則表達式:

Dim regex = New Regex("((" & vbCr & ")(?!" & vbLf & ")|(?<!" & vbCr & ")(" & vbLf & "))") 

拋出此您的輸入,就大功告成了:

leHTML = regex.Replace(leHTML, vbCrLf) 

下面是一個簡單的測試程序(vbCrvbLf分別被替換爲crlf,所以有一個可見的輸出) :

Dim str = "crlf cr cr lf crlf lf" 
Dim regex = New Regex("((cr)(?!lf)|(?<!cr)(lf))") 
str = regex.Replace(str, "crlf") 
Console.WriteLine(str) 

結果是:

crlf crlf crlf crlf crlf crlf 
+0

我應該用'\ r'和'vbLf'替換'vbCr'與'\ n'嗎? – Theveloper

+0

這是C#語法,不能在VB中工作。 –

+0

這些是正則表達式修飾符,雖然這代表了同樣的事情... – Theveloper

1

你將不得不在這方面努力一點。不要盲目地替換角色,你需要先看看有什麼,然後確定你要替換的是什麼。例如(這不是完整的代碼):

if leHTML.contains(vbcr) andalso leHTML.contains(vblf) then 
    leHTML = leHTML.Replace(vbCr & vbLf, vbCrLf) 
elseif leHTML.contains(vbcr) then 
    leHTML = leHTML.Replace(vbCr, vbCrLf) 
elseif leHTML.contains(vblf) then 
    leHTML = leHTML.Replace(vbLf, vbCrLf) 
else 
    ... 
end 
1

也許這是使用正則表達式替換表達式的好模式。

例如

Dim pattern = "(\r|\n)" 
Dim search = "The" & vbCr & "Test string" & vbCr & _ 
      "used as an" & vbLf & "Example" & vbCrLf & "." 
Dim m = Regex.Replace(search, pattern, vbCrLf) 
Console.WriteLine(m) 

第一行準備圖案來搜索使用C#語法vbCr=\rvbLf=\n在任選的基團的兩個字符包圍(找VBCR或vbLf)。
然後,替換方法搜索一個或另一個字符,並將其替換爲雙vbCrLf字符序列。
但是,現在我們有一個問題,單vbCrLf存在於測試字符串中增加了一倍,所以你需要另一個替換到只用一個vbCrLf刪除重複序列

pattern = "\r\n\r\n" 
m = Regex.Replace(search, pattern, vbCrLf) 
Console.WriteLine(m) 
+0

謝謝史蒂夫,這絕對有幫助,用正則表達式實現這一點非常容易! – Theveloper