为什么当分隔符超过一个字符时拆分似乎无法正常工作?

Why split seems not to work properly when separator is more than one char?

我是 vb.net 的新手,我不明白为什么如果分隔符超过一个字符,拆分的工作方式会有所不同。

我已经在 .net 上试过了 fiddle 结果令我惊讶:

Dim Txt as string = "123_|_ABC_|_sd"
Dim c() as string

c= Txt.Split("_|_")

console.WriteLine(c.length)
For i = 0 to c.length -1
    console.WriteLine(c(i))
Next
Txt = "123|ABC|sd"  
c= Txt.Split("|")

console.WriteLine(c.length)
For i = 0 to c.length -1
    console.WriteLine(c(i))
Next

第一部分代码的结果是:

5
123
|
ABC
|
sd

第二部分代码:

3
123
ABC
sd

我的问题是: 为什么会这样? 有没有办法用多个字符的分隔符来获取第二部分代码的结果?

您可以尝试使用 Regex.Split() 模式

"_\|_"

示例:

Imports System.Text.RegularExpressions

Module Module1
    Sub Main()
        Dim Txt As String = "123_|_ABC_|_sd"
        Dim c() As String

        c = Regex.Split(Txt, "_\|_")

        For i = 0 To c.Length - 1
            Console.WriteLine(c(i))
        Next

        Console.ReadLine()
    End Sub
End Module

结果:

123
ABC
sd

.NET String.Split() 方法接受两个参数:

  1. 你要拆分的字符串
  2. 一个字符列表,其中任何字符都将被识别为分隔符

所以,这行代码:

c= Txt.Split("_|_")

没说 "use | as a delimter"。相反,它说 "use _ or | or _ as a delimiter".

获得所需行为的最直接方法是使用 Microsoft.VisualBasic 命名空间中的字符串 class。这经常被嘲笑,但在某些情况下,它比相应的 .NET classes.

做得更好

所以,导入 Microsoft.VisualBaisc 命名空间,然后...

c = Split(Txt,"_|_")