2012-11-16 16 views
1

我有以下的正則表達式解析出一個電子名片(VB)試圖解析出電子名片名稱輸入與正則表達式

 Dim options As New RegexOptions() 
     options = RegexOptions.IgnoreCase Or RegexOptions.Multiline Or RegexOptions.IgnorePatternWhitespace 
     regex = New Regex("(?<strElement>(N)) (;[^:]*)? (;CHARSET=UTF-8)? (:(?<strSurname>([^;\n\r]*))) (;(?<strGivenName>([^;\n\r]*)))? (;(?<strMidName>([^;\n\r]*)))? (;(?<strPrefix>([^;\n\r]*)))? (;(?<strSuffix>[^;\n\r]*))?", options) 
     m = regex.Match(s) 
     If m.Success Then 
      Surname = m.Groups("strSurname").Value 
      GivenName = m.Groups("strGivenName").Value 
      MiddleName = m.Groups("strMidName").Value 
      Prefix = m.Groups("strPrefix").Value 
      Suffix = m.Groups("strSuffix").Value 
     End If 

,當我有它的工作方式電子名片,如:

BEGIN:VCARD 
VERSION:2.1 
N:Bacon;Kevin;Francis;Mr.;Jr. 
FN: Mr. Kevin Francis Bacon Jr. 
ORG:Movies.com 

但它時,vCard是這樣的工作不正常:

BEGIN:VCARD 
VERSION:2.1 
N:Bacon;Kevin 
FN:Kevin Bacon 
ORG:Movies.com 

正則表達式分配<strSuffix>凱文,而不是<strGivenName>像我想要的。我怎樣才能解決這個問題?

改編正則表達式從這裏走過:vCard regex

+0

你使用哪個'選項? –

+0

另外,我不知道這怎麼可以在第一個示例輸入上工作。爲什麼它不匹配'N:VCARD'?或'N:2.1'?或'N:Kevin Francis Bacon Jr.'先生? (呃,實際上只有前兩個是奇數,因爲你只返回第一個匹配) –

+0

另一個:你爲什麼要把'Bacon'分配給''?你的意思是凱文嗎?你的意思是''? –

回答

2

你要善於用正則表達式

^N(?:;(?!CHARSET=UTF-8)[^:]*|)(?:;CHARSET=UTF-8|):(?<strSurname>[^;\n\r]*);?(?<strGivenName>[^;\n\r]*);?(?<strMidName>[^;\n\r]*);?(?<strPrefix>[^;\n\r]*);?(?<strSuffix>[^;\n\r]*) 

this例子,this例子。

0

我會避免使用獨特的正則表達式解析每一行,而是標記每行。然後讓結果確定是否缺少(可選)項目。這是一種模式,它通過其代碼和數據項簡單標記每行(使用明確捕獲&多行)。

^(?<Code>[^:]+)(:)((?<Tokens>[^;\r\n]+)(;?))+ 

這強調創建處理數據是否丟失的業務邏輯的個別代碼對象。失敗不再是正則表達式失敗,而是業務邏輯後處理失敗,恕我直言,它更好地調試和維護。