.net 通过回车换行拆分字符串

o4tp2gmn  于 2023-06-25  发布在  .NET
关注(0)|答案(2)|浏览(217)

我正在尝试通过char 10和13拆分字符串。在下面的所有这些例子中,包含\r\n的整个字符串以第一个元素行结束(0)我做错了什么?
代码在Windows 10上运行。VB.NET:

Dim info As String = "abc\rsome data \nmore data\n the end\r"

Dim lines As String() = info.Split(New Char() {Chr(13), Chr(10)})
lines = info.Split(New String() {Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries)
lines = info.Replace(Chr(13), "").Split(Chr(10))
lines = info.Split(New Char() {vbCrLf, vbCr, vbLf}, StringSplitOptions.RemoveEmptyEntries)
lines = info.Split(New Char() {"\r", "\n", "\r\n"}, StringSplitOptions.RemoveEmptyEntries)

任何帮助非常感谢!

uurity8g

uurity8g1#

VB.Net不像C#那样支持转义字符,所以你的"\n"实际上就是"\""n"两个字符。
要首先构建该字符串,您应该使用Chr函数。这里是使用字符串插值

Dim info = $"abc{Chr(13)}some data {Chr(10)}more data{Chr(10)} the end{Chr(13)}"

现在你的代码应该可以工作了

Dim lines = info.Split({Chr(10), Chr(13)})

您的原始字符串不等于

Dim info = "abc
some data 
more data
the end
"

因为:
Chr(13) <> Environment.NewLine
Chr(10) <> Environment.NewLine
在Windows中,Environment.NewLine = Chr(13) & Chr(10)

fnvucqvd

fnvucqvd2#

换行符可以是回车、换行或回车和换行。这对显然是Windows的默认值,但回车符本身是Unix的默认值,并由Windows写字板应用程序使用,大概是为了RTF与Unix的互操作性。在VB.NET中,您应该使用ControlChars类来处理这类事情。Cr字段是包含回车的CharLf字段是包含换行符的CharCrLfNewLine字段都是包含回车和换行符的Strings。如果你想在回车和换行符对上拆分,那么你需要使用String.Split的重载之一,它在子字符串上拆分,而不是单个Chars,例如:

Module Module1

    Sub Main()
        Dim str = "First line
Second line
Third line"
        Dim parts = str.Split({ControlChars.NewLine}, StringSplitOptions.None)

        For i = 0 To parts.GetUpperBound(0)
            Console.WriteLine($"{i} {parts(i)}")
        Next
    End Sub

End Module

输出:

0 First line
1 Second line
2 Third line

如果您也想允许单字符换行符,那么您可以指定多个分隔符。只要确保将多字符选项放在第一位,这样它们就优先,例如:

Dim str = $"First line{ControlChars.Cr}Second line{ControlChars.Lf}Third line{ControlChars.CrLf}Fourth line"
Dim parts = str.Split({ControlChars.NewLine, ControlChars.Cr, ControlChars.Lf}, StringSplitOptions.None)

For i = 0 To parts.GetUpperBound(0)
    Console.WriteLine($"{i} {parts(i)}")
Next

相关问题