在VB.NET中拆分字符串时出现奇怪的结果

时间:2012-05-05 01:27:46

标签: vb.net arrays string split

当对字符串进行多次拆分时,我得到了奇怪的结果,所以我决定做一个简单的测试来弄清楚发生了什么

testString“1234567891011121314151617181920”

如果我想在Javascript中得到10到20之间的什么,我会这样做:

var results = testString.split("10")[1].split("20")[0]

哪会返回 111213141516171819

然而,当我在VB中执行此操作时,我得到 111

Split(testString,"10")(1).Split("20")(0)

似乎第二次分裂只是承认第一个角色,无论我放置什么。

所以它在字符串中找到下一个“2”时停止,即使“2abc”也会有相同的结果,即使该字符串甚至不存在。

4 个答案:

答案 0 :(得分:2)

String.Split没有只接受String的重载。参数是Char数组或String数组。您的字符串可能正在转换为char数组。像这样显式传递一个字符串数组:

testString.Split(New String() { "10" }, StringSplitOptions.None)

答案 1 :(得分:1)

Vb仅将delimiter参数视为单个字符。

答案 2 :(得分:1)

尝试包装第二个分割,使其像第一个分割,即:

Split( Split(testString,"10")(1), "20" )(0)"

答案 3 :(得分:1)

这是一个棘手的场景,我之前见过旅行的人,所以我认为这比其他答案给出的解释更值得。使用原始格式Split(testString,"10")(1).Split("20")(0),您无意中使用了两个不同 Split函数。

第一个Split(testString,"10")正在使用Microsoft.VisualBasic.Strings.Split函数,它接受String类型参数。 http://msdn.microsoft.com/en-us/library/microsoft.visualbasic.strings.split(v=vs.110).aspx

第二个.Split("20")(0)正在使用System.String.Split方法,该方法没有带有String参数的重载。 http://msdn.microsoft.com/en-us/library/System.String.Split(v=vs.110).aspx

所以发生的事情是:

  1. Split(testString,"10")使用Microsoft.VisualBasic.Strings.Split 返回新的String(){" 123456789"," 11121314151617181920"}
  2. (1)表示获取返回数组的第一个位置,即" 11121314151617181920"
  3. "11121314151617181920".Split("20")(0)使用System.String.Split,并尝试拆分字符串分隔符" 20"
  4. 注意:字符串" 20" param被隐式转换为char" 2"因为String.Split唯一的单个参数重载具有Public Function Split (ParamArray separator As Char()) As String()的签名。 ParamArray参数选项允许您将逗号分隔的值列表传递给函数,类似于String.Format如何使用动态的替换值。 http://msdn.microsoft.com/en-us/library/538f81ec.aspx
  5. 第3步代码变为"11121314151617181920".Split(new Char() {CChar("20")})(0),使用文字值为"11121314151617181920".Split(new Char() {"2"c})(0)。结果是{" 111"," 13141516171819"," 0"}。获得第0个位置,返回" 111"。
  6. 为避免混淆,您应该将代码转换为双方使用相同版本的Split。

    以下两个示例中的任何一个都应该有效:

    示例1 :使用Microsoft.VisualBasic.Strings.Split

    Split( Split(testString,"10")(1), "20" )(0)
    

    示例2 :使用System.String.Split

    testString _ 
        .Split(New String() {"10"}, StringSplitOptions.None)(1) _ 
        .Split(New String() {"20"}, StringSplitOptions.None)(0)