2013-05-28 41 views
0

我有一些数据的变化如下列表,我一直在试图找出一个正则表达式能够将所有这些数据分成两组。 A组应该是UM和B组应该是或832.0如果小数和任何数字应遵循。例如,如果它是UM832.56.NI只想获得组B的832.56。组A总是字母,并且应该始终启动字符串,但正如您所看到的那样,它们末尾有一个字母。如果我能想出一些适合除了那个之外的所有东西,我会很乐意为那个问题抛出一个错误。正则表达式帮助多种格式的数据需要

  1. UM 832.0.N
  2. UM 832.0
  3. UM 832.N
  4. UM 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 

我敢肯定这是一些简单的我正在俯视,就像一面旗帜或对正则表达式的误解,但在这一点上我已经遇到了挫折的障碍。

编辑 好了,所以之后重新阅读在这里我的问题,我意识到我无奈的那部分是空的匹配。我仍不确定他们为什么在那里,但我至少可以跳过他们的代码。那么什么是允许期间(又名小数点)是一个匹配?

回答

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)不输出列出,因为它比赛失败了。

+0

这似乎已经完成了这项工作。谢谢。 –

0

请问这样做?

(?<GroupA>UM)\s?(?<BroupB>[0-9]+(\.[0-9]+)?)