用两个单引号进行字符串分割

3
我有一个裸字符串,其中每个单词都在两个单引号之间用逗号分隔。
Dim str As String = "a','b','c','d','e"

我想使用','来分割字符串,以便得到以下数组:

["a", "b", "c", "d", "e"]

我的代码如下:

str.Split("','")

返回结果:

返回的数组是["a", ",", "b", ",", "c", ",", "d", ",", "e"]

我没有预料到这种行为,想要解释一下字符串是如何被分割的。


4
用C#语言的术语来说,var parts = str.Split(new string[] { "','" }, StringSplitOptions.None); 可以正常运行...有趣的是,没有 String.Split(String) 的重载,我想知道你遇到了什么问题... - Marc Gravell
1
我认为你在 b',c 中漏掉了一个单引号。 - Avinash Raj
3
@MarcGravell - Option Strict关闭了,因此Split方法使用字符串的第一个字符 ' 进行分割。 - Matt Wilko
1
@MattWilko 真的吗?VB会这样做吗?(深深地摇头表示谴责...) - Marc Gravell
1
@MarcGravell - 真的 - 这就是为什么默认情况下应该启用Option Strict。这是微软一个糟糕的决定/疏忽。 - Matt Wilko
显示剩余2条评论
4个回答

3
你不需要正则表达式,可以使用Split(","c)并且用String.Trim移除所有的'
Dim result = str.Split(","c).Select(Function(s) s.Trim("'"c)).ToArray()

结果:a,b,c,d,e

附注:使用Option Strict关闭时,Split(“','”)仅按第一个字符拆分,而不是整个子字符串。如果您想要这样做,您需要使用String.Split的重载。

例如(注意{"','"}string()):

str.Split({"','"}, StringSplitOptions.None)

如果开启了 Option Strict On,这段代码甚至无法编译通过,这是一件好事,因为没有重载。所以我建议默认设置 Option StrictOn。通过解决编译错误,您将学习更多有关框架和.NET类型的知识。这样做也可以让你写出更加健壮的代码。


这只是在逗号上进行拆分;这可能有效,也可能无效 - 这取决于实际字符串的其他内容。 - Marc Gravell
1
@MarcGravell:我不清楚其他部分。但是根据OP的要求,有点奇怪,因为根据他的需求,即使是小样本也包含无效数据(_“每个单词在两个单引号之间由逗号分隔”-->,c',)。所以依我看,“正确”的答案不会返回所需的结果。 - Tim Schmelter

3
意外结果的原因是你将一个字符串作为参数传递给了Split方法。由于没有接受字符串参数的Split重载方法,所以在使用Option Strict关闭时,编译器会使用Split(Char)重载方法,只取字符串中的第一个字符。因此,在你的情况下,
String.Split("','")

等同于

String.Split("'")

如果您想启用Option Strict功能,则您的代码将不会编译(这是一件好事,因为它避免了像这样的错误)。

要实现您的需求,您必须向该方法传递一个字符串数组(在这种情况下,是一个只包含一个字符串的数组):

    Dim input As String = "a','b','c','d','e"
    Dim splitChars() As String = {"','"}
    Dim output As String() = input.Split(splitChars, StringSplitOptions.None)

1
我一直跟到最后一行;在我看来,OP显然想要按“','”拆分,因此应该使用接受String[](和枚举)的重载方法。 - Marc Gravell
@MarcGravell - 我更新了我的回答,希望能更清晰明了。 - Matt Wilko
@MattWilko 我在两个字母之间得到了两个空字符串。例如,output[0] = "a",output[1] = "",output[2] = "",output[3] = "b"等等。 - h-rai

2

您可以不使用正则表达式来实现。尝试使用以下方法:

    Dim str As String = "a','b','c','d','e" 'note that ',c was changed to ','c

    Dim seperator() As String = New String() {"','"}
    Dim result() As String = str.Split(seperator, StringSplitOptions.RemoveEmptyEntries)

我用以下c#代码尝试过这个:

string source = "a','b','c','d','e";
var seperator = new string[] {"','"};
var result = source.Split(seperator, StringSplitOptions.RemoveEmptyEntries);

然后通过http://www.developerfusion.com/tools/convert/csharp-to-vb/进行转换,因此vb.net语法可能不太准确。

结果如下:

来自LinqPad的图片


@dbasnett 谢谢您的改进。我很感激。 - Marco

0

它运行良好,请尝试...

   Note: Imports System.Text.RegularExpressions

  Public Shared Function SplitStr(ByVal List As String) As String

    Dim col As MatchCollection = Regex.Matches(List, "'(.*?)'")
    Dim newList As String = ""

    For Each m As Match In col
        Dim g As Group = m.Groups(1)
        If newList = "" Then
            newList = g.Value
        Else
            newList += "," & g.Value
        End If
    Next
    Return newList
End Function

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接