0

我有一个字符串,我试图用 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?有没有更好的方法来“规范化”换行和回车?

4

3 回答 3

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=\r并将vbLf=\n两个字符括在一个可选组中(查找 vbCr 或 vbLf)。
然后替换方法搜索一个或另一个字符并将其替换为双 vbCrLf 字符序列。
但是现在我们有一个问题,测试字符串中存在的单个 vbCrLf 已经加倍了,所以你需要另一个替换来删除只有一个 vbCrLf 的双序列

pattern = "\r\n\r\n"
m = Regex.Replace(search, pattern, vbCrLf)
Console.WriteLine(m)
于 2013-09-26T21:36:30.967 回答
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
于 2013-09-26T21:36:38.910 回答
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
于 2013-09-26T21:12:47.443 回答