【问题标题】:Split a String Based on Strings in an Array根据数组中的字符串拆分字符串
【发布时间】:2017-04-11 17:54:24
【问题描述】:

给定一个字符串...

M0 Apple Sauce M1 Peanut Butter M2 Porcupine M3 Quesadilla M4 Margarita

我怎么能把那个字符串分成..

M0 Apple Sauce
M1 Peanut Butter
M2 Porcupine
M3 Quesadilla
M4 Margarita 

有没有办法将M0, M1,..., M4 放入一个数组中,然后使用该数组来拆分字符串?

【问题讨论】:

  • 更好,使用正则表达式 - Regex.Split(s, "(?!^)(?=\bM\d+\b)")
  • @WiktorStribiżew 我刚刚读到这个,你能用我上面的例子举个例子吗?
  • 您在寻找什么样的输出? (例如,具有 2 列、1 列或字符串数​​组的 DataTable?)
  • 参见this demo拆分列表
  • 刚刚测试了 Wiktor 的正则表达式字符串,效果很好。

标签: arrays string vb.net list split


【解决方案1】:

完全归功于Wiktor Stribizew

Imports System.Text.RegularExpressions
Public Class frmMain
    Private Sub frmMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim stString As String = "M0 Apple Sauce M1 Peanut Butter M2 Porcupine M3 Quesadilla M4 Margarita"
        Dim arrString() As String
        arrString = Regex.Split(stString, "(?!^)(?=\bM\d+\b)")
        For Each st As String In arrString
            MessageBox.Show(st)
        Next
    End Sub
End Class

正则表达式解释:

在拆分方法中使用正则表达式字符串这一事实意味着您的正则表达式模式的目标是在字符串中找到要拆分的位置。
正则表达式字符串!?^ 的第一段只是断言在位置 0 处没有“匹配”。我们在位置 0 处确实有匹配,但我们不希望输出中出现长度为 0 的字符串,所以我们使用这个规定。我将分解第二个子表达式?=\bM\d+\b

  • ?= 用于表示“我们正在光标前面寻找以下模式的匹配项” - 不使用文本
  • \b 补充说,匹配必须出现在字母数字字符旁边的非字母数字字符(在这种情况下,总是一个空格和一个M);这是任何“单词边界”
  • M 确实是 M 的字面字符匹配
  • \d 匹配任何十进制数字
  • + 表示此时一行中可能有任意个小数位(一个或多个小数位)
  • 最后一个 \b 详细说明数字以另一个单词边界结尾

【讨论】:

  • 太棒了,我很困惑为什么 "(?!^)(?=\bM\d+\b)" 能完成这项工作?
  • @Bob,是的,你必须复习regular expressions syntax 才能完全理解它。
  • 但简单地说...该表达式查找字母M 加上一个整数?我将使用它的代码将有M 一直到M60。它会为此工作吗?
  • 你可以保留它,只要解释一下模式的含义。没有解释,大量与正则表达式相关的答案是没有帮助的。
  • 是的,差不多。 (?=...) 是一个正向前瞻,它只检查模式匹配,但不使用文本。 \b 匹配单词边界(不仅仅是字母数字/非字母转换)。 + 匹配 1 个或多个实例,而不是任何实例。
【解决方案2】:

使用Regex.Split方法用正则表达式分割部分。

    Dim stringToSplit As String = "M0 Apple Sauce M1 Peanut Butter M2 Porcupine M3 Quesadilla M4 Margarita"
    Dim stringParts = Regex.Split(stringToSplit, "(?!^)(?=\bM\d+\b)")
    For i = 0 To stringParts.Length - 1
        Console.WriteLine(stringParts(i))
    Next

此代码将产生以下输出:

M0苹果酱

M1 花生酱

M2豪猪

M3 油炸玉米粉饼

M4 玛格丽塔

【讨论】:

    【解决方案3】:

    Regex 是解决这种不稳定问题的好方法。但是,如果您不喜欢 Regex,还有其他方法。 Step 关键字可以做到这一点。

    Dim sText As String = "M0 Apple Sauce M1 Peanut Butter M2 Porcupine M3 Quesadilla M4 Margarita"
        Dim split() As String = sText.Trim.Split(" ")
        Dim sResult As String = String.Empty
        For i = 0 To UBound(split) Step 2
            sResult &= split(i) & " " & split(i + 1) & vbCrLf
        Next
        MsgBox(sResult)
    

    请记住确保数据始终成对,并且每个元素之间用空格分隔。

    祝你好运!

    【讨论】:

      猜你喜欢
      • 2019-11-16
      • 2018-05-12
      • 1970-01-01
      • 1970-01-01
      • 2021-11-07
      • 1970-01-01
      • 2019-09-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多