一次更换2x vbCrLf

时间:2013-09-26 20:49:17

标签: vb.net string replace

我有一个字符串,其中我试图用VbCrLf替换所有VbCr / VbLf。这是为了抓取一些HTML。

我的代码如下所示:

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

然而,在许多情况下,我会留下2x vbCrLf,其中我只想要1。

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

上面的一行似乎没有做任何事情。如何用1x vbCrLf替换2x vbCrLf?有没有更好的方法来“规范化”换行和回车?

3 个答案:

答案 0 :(得分: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 :(得分: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)

第一行准备模式以使用vbCr=\r的C#语法和vbLf=\n搜索可选组中的两个字符(查找vbCr或vbLf)。
然后,replace方法搜索一个或另一个char,并用双vbCrLf字符序列替换它 但是现在我们遇到了一个问题,测试字符串中存在的单个vbCrLf已加倍,所以你需要另一个替换来删除只有一个vbCrLf的双序列

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

答案 2 :(得分: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