我从文件导入多个字符串。字符串的格式如下:
Smith, Tom 1/2/62 45484
[Last Name], [First Name] [Date] [Number]
我需要一种方法将这些分成四个变量。
Dim first_name as string = first name
等
我以为我可以使用正则表达式,但我一直在用它打墙。
感谢您的帮助!
答案 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()
结果:
正则表达式匹配:
(?<lastname>[\p{L}\s]+)
- 仅包含Unicode字母和空格的姓氏,\s+
- 一个逗号和一个或多个分隔姓氏和名字的空格(?<firstname>[\p{L}\s]+)
- 仅包含Unicode字母和空格的第一个名称\s+
- 分隔名称和日期的一个或多个空格(?<date>[\d/]+)
- 日期元素\s+
- 分隔日期和ID的一个或多个空格(?<id>\d+)
- 只包含数字的id
。