【问题标题】:String split with two single quotes用两个单引号分割字符串
【发布时间】:2014-09-08 08:17:52
【问题描述】:

我有一个裸字符串,其中每个单词在两个单引号之间用逗号分隔。

Dim str As String = "a','b','c','d','e"

我想使用',' 拆分字符串,这样我就有一个如下数组:

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

我的代码如下:

str.Split("','")

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

我没想到会出现这种行为,我正在寻找有关如何拆分字符串的解释。

【问题讨论】:

  • 在 C# 术语中,var parts = str.Split(new string[] { "','" }, StringSplitOptions.None); 工作正常...有趣的是,没有 String.Split(String) 过载 - 我想知道你在打什么...
  • 我想你错过了b',c中的单引号
  • @MarcGravell - Option Strict 关闭,因此拆分使用字符串的第一个字符 '
  • @MattWilko 认真的吗? VB会这样做吗? (以一种深刻的判断方式摇头......)
  • @MarcGravell - 说真的 - 这就是为什么 Option Strict 应该默认打开的原因。这是 MS 的一个糟糕的决定/监督

标签: .net regex vb.net string split


【解决方案1】:

意外结果的原因是您将字符串作为参数传递给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)

【讨论】:

  • 我一直陪着你直到最后一行; IMO,OP 显然想要拆分 "','",因此它应该使用接受 String[](和枚举)的重载
  • @MarcGravell - 更新了我的答案,希望能让这个更清楚
  • @MattWilko 我在两个字母之间得到两个空字符串。例如,输出[0] = "a"、输出[1] = ""、输出[2] = ""、输出[3] = "b" 等等。
【解决方案2】:

您不需要正则表达式,您可以使用Split(","c) 并删除所有'String.Trim

Dim result = str.Split(","c).Select(Function(s) s.Trim("'"c)).ToArray()

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

旁注:Option StrictOff Split("','") 仅按第一个字符而不是整个子字符串拆分。如果你想要,你需要使用String.Split 的重载。

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

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

Option Strict On 甚至不会编译,这是一件好事,因为没有重载。所以我建议默认将Option Strict 设置为On。通过修复编译器错误,您将学到很多关于框架和 .NET 类型的知识。您还将学习以这种方式编写更健壮的代码。

【讨论】:

  • 这只是在逗号上进行拆分;这可能有效也可能无效 - 这取决于 actual 字符串的其他内容。
  • @MarcGravell:我不知道其余的。但是 OP 的要求有点奇怪,因为根据他的要求,小样本已经包含无效数据(“每个单词在两个单引号之间用逗号分隔” --> ,c',)。所以恕我直言,“正确”的答案不会返回所需的结果。
【解决方案3】:

您可以在没有正则表达式的情况下做到这一点。试试这个:

    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 的语法可能很粗略。

结果:

【讨论】:

  • @dbasnett 感谢您的改进。我很感激。
【解决方案4】:

效果不错,试试吧……

   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

【讨论】:

    猜你喜欢
    • 2011-03-26
    • 2022-09-28
    • 2016-09-16
    • 2011-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-18
    • 2020-08-30
    相关资源
    最近更新 更多