String.Split()使用VbCrLf不起作用,但首先用""替换VbCr然后在VbLf上拆分确实有效。为什么?
我有一个嵌入的文本文件作为资源。内容是:
Apple
Pear
Orange
我试图把它拉成一个List(Of String)但回车和换行符把它搞砸了。
例如我试试这个:
Dim myNames As List(Of String) = My.Resources.TreeNames.Split(CChar(vbCrLf)).ToList
但是正在传递换行符:
"Apple"
vbLf & "Pear"
vbLf & "Orange"
所以我尝试使用环境变量:
Dim myNames As List(Of String) = My.Resources.TreeNames.Split(CChar(Environment.NewLine)).ToList
但这会导致完全相同的输出。
所以我尝试在换行符上拆分它:
Dim myNames As List(Of String) = My.Resources.TreeNames.Split(CChar(vbLf)).ToList
现在正在传递回车符:
"Apple" & vbCr
"Pear" & vbCr
"Orange"
所以我让这个工作的唯一方法是首先用空替换vbCr然后在左边拆分vbLf:
Dim myNames As List(Of String) = Replace(My.Resources.TreeNames, vbCr, "").Split(CChar(vbLf)).ToList
谁能解释为什么?如果我使用以下命令将文件直接拉入字符串:
Dim myNames as String = My.Resources.TreeNames
我得到:
"Apple" & vbCrLf & "Pear" & vbCrLf & "Orange"
为什么 split 不能正常工作?
回答
请参阅有关CChar(<expression>)的文档:
任何有效的 Char 或 String 表达式;只转换字符串的第一个字符;值可以是 0 到 65535(无符号)
所以CChar(vbCrLf)只返回VbCr( r- &H0D)
由于您现在只在 上拆分源字符串VbCr,因此换行符VbLf( n- &H0A) 仍然存在。
您需要接受字符串或字符数组的String.Split()重载:
请注意,这vbCrLf是一个字符串类型,因此VbCr和VbLf
Dim res = My.Resources.TreeNames
' As an array of String
Dim myNames = res.Split({vbCrLf}, StringSplitOptions.RemoveEmptyEntries).ToList()
'Or
Dim myNames = res.Split({vbCr, VbLf}, StringSplitOptions.RemoveEmptyEntries).ToList()
或者作为字符数组:
Dim myNames = res.Split(vbCrLf.ToCharArray(), StringSplitOptions.RemoveEmptyEntries).ToList()
' Or
Dim myNames = res.Split({ChrW(13), ChrW(10)}, StringSplitOptions.RemoveEmptyEntries).ToList()
StringSplitOptions.RemoveEmptyEntries用于删除通过拆分多个连续字符生成的空行。
没有它,使用您的示例字符串 - 由回车符 + 换行符分隔的 3 个项目 - 您将获得 5 个元素而不是 3 个元素的数组,其中包括 2 个空元素。
THE END
二维码