0

我有以下一些数据的变体列表,我一直在尝试找出一个正则表达式,以便能够将所有这些数据分成两组。A 组应为UM,B 组应为832832.0(如果小数点后应跟随任何数字)。例如,如果它是 UM832.56.NI,则只想为 B 组获取832.56。A组将始终是字母,并且应该始终以字符串开头,但正如您所见,它们在结尾处有一个。如果我能想出适合除那个之外的所有内容的东西,我会很乐意为那个抛出一个错误。

  1. UM 832.0.N
  2. 嗯 832.0
  3. 嗯 832.N
  4. 嗯 832
  5. UM832
  6. 832UM
  7. UM832.0.N
  8. UM832.0
  9. UM832.N

我想出了下面的正则表达式,它可以部分工作。

(?<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

我很确定这是我忽略的简单事情,例如标志或对正则表达式的误解,但此时我遇到了挫折障碍。

编辑 好吧,在这里重新阅读我的问题后,我意识到我的部分挫败感是空匹配。我仍然不确定它们为什么在那里,但我至少可以在代码中跳过它们。那么是什么允许句点(又名小数点)匹配?

4

2 回答 2

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) 未在输出中列出,因为它匹配失败。

于 2013-05-28T17:32:48.903 回答
0

这会奏效吗?

(?<GroupA>UM)\s?(?<BroupB>[0-9]+(\.[0-9]+)?)
于 2013-05-28T17:25:38.887 回答