我有一个字符串,其中我试图用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?有没有更好的方法来“规范化”换行和回车?
答案 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)
把这些放在一起,我们得到以下正则表达式:
Dim regex = New Regex("((" & vbCr & ")(?!" & vbLf & ")|(?<!" & vbCr & ")(" & vbLf & "))")
将此信息投入到您的输入中,您就完成了:
leHTML = regex.Replace(leHTML, vbCrLf)
以下是一个简单的测试程序(vbCr
和vbLf
已分别替换为cr
和lf
,因此有一个可见的输出):
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