我在下面列出了一些数据的变化,我一直试图找出一个正则表达式,能够将所有数据分成两组。 A组应 UM ,B组应 832 或 832.0 ,如果小数和任何数字应遵循。例如,如果它是UM832.56.NI只想获得B组的 832.56 。组A将始终是字母,并且应始终开始字符串,但正如您所看到的那样,他们在最后。如果我能想出一些适合除了那个之外的东西,我会很乐意为那个抛出一个错误。
我已经提出了下面的正则表达式接缝部分工作。
(?<GroupA>^[a-zA-Z]*)|(?<GroupB>\d*[\.]*\d*)
我得到的输出是:
Original Data: UM 832.0.N Match: UM
Original Data: UM 832.0.N Match:
Original Data: UM 832.0.N Match: 832.0
Original Data: UM 832.0.N Match: .
Original Data: UM 832.0.N Match:
Original Data: UM 832.0.N Match:
Original Data: UM 832.0.N Match:
Original Data: UM 832.0.N Match:
我使用的代码非常简单vb.net:
Private Sub DebugParse(Data As String)
Dim strRegex As String = "(?<GroupA>^[a-zA-Z]*)|(?<GroupB>\d*[\.]*\d*)"
Dim myRegexOptions As RegexOptions = RegexOptions.IgnoreCase Or RegexOptions.Multiline Or RegexOptions.IgnorePatternWhitespace
Dim myRegex As New Regex(strRegex, myRegexOptions)
Dim strTargetString As String = "UM 832.0.N"
For Each myMatch As Match In myRegex.Matches(strTargetString)
If myMatch.Success Then
Debug.WriteLine("Original Data: " & Data & " Match: " & myMatch.Value)
End If
Next
End Sub
我很确定这是一个简单的东西我可以忽略,就像一面旗帜或对正则表达式的误解,但此时我已经遇到了挫折障碍。
修改 好了,在重新阅读我的问题后,我意识到我的挫败感部分是空洞的比赛。我仍然不确定他们为什么会在那里,但我至少可以在代码中跳过它们。那么什么是允许周期(又名小数点)匹配?
答案 0 :(得分:1)
我使用(?<GroupA>^[a-zA-Z]+)\s*(?<GroupB>\d*\.*\d*).*$
运行了您的数据,并且只设置了RegexOptions.Multiline
,提供了此输出:
GroupA GroupB
UM 832.0.N UM 832.0
UM 832.0 UM 832.0
UM 832.N UM 832.
UM 832 UM 832
UM832 UM 832
UM832.0.N UM 832.0
UM832.0 UM 832.0
UM832.N UM 832.
如您所见,数据6(832UM
)未在输出中列出,因为匹配失败。
答案 1 :(得分:0)
这可以解决问题吗?
(?<GroupA>UM)\s?(?<BroupB>[0-9]+(\.[0-9]+)?)