【问题标题】:vb.net array from comma separated strings来自逗号分隔字符串的 vb.net 数组
【发布时间】:2017-04-17 08:03:51
【问题描述】:

我想从一个用空格(“”)和逗号分隔的字符串中获取一个字符串数组。有没有聪明的方法来做到这一点?

例如,如果字符串是:

猫狗长颈鹿“大象”蛇

我希望结果数组包含字符串

长颈鹿

大象

我知道我可以执行 Split(str, " ") 但结果会与我想要的不同。我从未使用过 RegEx,但我有一种预感,该解决方案可能与它有关。

【问题讨论】:

  • 为什么不先到.Replace(),然后再到.Split()?正则表达式在这里是多余的。
  • 替换什么,@DanielShillcock?

标签: arrays vb.net string


【解决方案1】:

将输入视为以空格分隔的 CSV 可以大大简化任务:

Imports Microsoft.VisualBasic.FileIO.TextFieldParser
...
Dim s As String = "cat dog giraffe ""big elephant"" snake"
Dim afile As FileIO.TextFieldParser = New FileIO.TextFieldParser(New System.IO.StringReader(s))
Dim CurrentRecord As String()
afile.TextFieldType = FileIO.FieldType.Delimited
afile.Delimiters = New String() {" "}
afile.HasFieldsEnclosedInQuotes = True
Do While Not afile.EndOfData
    Try
        CurrentRecord = afile.ReadFields
        Console.WriteLine(String.Join("; ", CurrentRecord))
    Catch ex As FileIO.MalformedLineException
        Stop
    End Try
Loop

它打印cat; dog; giraffe; big elephant; snake

代码改编自Parse Delimited CSV in .NET

【讨论】:

  • 谢谢。就可以了。
【解决方案2】:

您可以为此使用正则表达式:

Const data = "åäöÄ åäöÄ ""åäöÄ åäöÄ"" åäöÄ"

Dim matches = Regex.Matches (data, "\p{L}+|""\p{L}+(?: \p{L}+)*""")

For Each m As Match in matches
    Console.WriteLine (m.Value.Trim(""""))
Next

正则表达式的工作方式如下:

  • 匹配 \p{L}+ 表示尽可能多的一个或多个字母
  • (用|表示)匹配"\p{L}+(?:\p{L}+)*" 详细:
    • " 匹配引号
    • \p{L}+ 尽可能匹配一个或多个字母
    • (?: \p{L}+)* 表示不会导致捕获尽可能重复零次或多次的组
      该组由一个空格组成,后跟尽可能多的一个或多个字母
    • 最后匹配结束引号"

然后我们只需 Trim 匹配结果以消除潜在的开始/结束引用

注意:有关\p{L}的更多信息,请参阅here

【讨论】:

  • 非英文文本怎么办?输入åäö时会融化吗?
  • 它正在崩溃,虽然它没有被声明为要求,但我已经编辑了代码以支持它们
  • 取决于字母 öä 和 z 的位置。在我们的语言中,z 紧挨着 s (...pqrszšžt...),甚至 t, u 等都被忽略了 :)
  • @Sehnsucht 有趣,感谢您的指出。 unicode 字母是否包含数字和标点符号? (例如“big.0-eléphant”案例)
猜你喜欢
  • 2014-05-27
  • 2021-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-03
  • 2012-07-20
  • 1970-01-01
相关资源
最近更新 更多