在visual basic中拆分字符串

时间:2015-08-17 14:05:00

标签: regex vb.net string vba

我从文件导入多个字符串。字符串的格式如下:

Smith, Tom 1/2/62 45484

[Last Name], [First Name] [Date] [Number]

我需要一种方法将这些分成四个变量。

Dim first_name as string = first name

我以为我可以使用正则表达式,但我一直在用它打墙。

感谢您的帮助!

2 个答案:

答案 0 :(得分:5)

是的,RegEx是一个很好的选择。以下是你在VB中的表现:

Dim input As String = "Smith, Tom 1/2/62 45484"
Dim pattern As String = "(?<last>.*?), (?<first>.*?) (?<date>\S+) (?<number>\d+)"
For Each m As Match In Regex.Matches(input, pattern)
    Dim last As String = m.Groups("last").Value
    Dim first As String = m.Groups("first").Value
    Dim [date] As String = m.Groups("date").Value
    Dim number As String = m.Groups("number").Value
Next

您可能需要调整模式以满足您的需求。以下是我演示的模式的含义:

  • (?<last>.*?) - 捕获字符串的姓氏部分
    • ( - 开始捕捉小组
    • ?<last> - 为捕获组提供名称
    • . - 任何角色
    • *? - 任意次数(任意长度的字符),非贪婪。在?之后放置*是非贪婪的原因。非贪婪只是意味着它将捕获尽可能少的字符串(即只到第一个逗号而不是直到最后一个逗号)
    • ) - 结束捕获组
  • , - 必须有逗号后跟名字和姓氏之间的空格
  • (?<first>.*?) - 获取名字。 .*?捕获任何长度的任何角色,非贪婪。
  • - 名字和日期之间必须有一个空格
  • (?<date>\S+) - 截取日期。 \S+捕获一个或多个非空白字符。
  • - 日期和数字之间必须有一个空格
  • (?<number>\d+) - 捕获号码。 \d+捕获一个或多个数字字符。

我使用了命名组,以便代码更清晰,更易读。您也可以使用编号组并通过索引读取它们(例如m.Groups(0).Value)。

另外,我使用循环来查看Matches的所有结果。但是,如果您只是一次给RegEx一行,或类似的东西,其中输入只能包含一个匹配,那么您可以使用Match方法,这更容易:

Dim m As Match = Regex.Match(input, pattern)
If m.Success Then
    Dim last As String = m.Groups("last").Value
    Dim first As String = m.Groups("first").Value
    Dim [date] As String = m.Groups("date").Value
    Dim number As String = m.Groups("number").Value
End If

答案 1 :(得分:0)

您还可以使用正则表达式和LINQ:

使用不同的方法
Dim person As String = "Smith, Tom 1/2/62 45484"
Dim rxPerson As Regex = New Regex("(?<lastname>[\p{L}\s]+),\s+(?<firstname>[\p{L}\s]+)\s+(?<date>[\d/]+)\s+(?<id>\d+)")
Dim matches_prs As IEnumerable(Of Match) = rxPerson.Matches(person).Cast(Of Match)().Select(Function(m) m)
Dim result = (From match In matches_prs
           Select New With {.lastname = match.Groups("lastname").Value,
                        .firstname = match.Groups("firstname").Value,
                        .date = match.Groups("date").Value,
                        .id = match.Groups("id").Value}).ToList()

结果:

enter image description here

正则表达式匹配:

  • (?<lastname>[\p{L}\s]+) - 仅包含Unicode字母和空格的姓氏
  • ,\s+ - 一个逗号和一个或多个分隔姓氏和名字的空格
  • (?<firstname>[\p{L}\s]+) - 仅包含Unicode字母和空格的第一个名称
  • \s+ - 分隔名称和日期的一个或多个空格
  • (?<date>[\d/]+) - 日期元素
  • \s+ - 分隔日期和ID的一个或多个空格
  • (?<id>\d+) - 只包含数字的id