2012-06-07 33 views
1

我試圖在電子郵件中查找未使用的合併域,並拋出解析器不支持的域。格式是[MERGEFIELD]。括號內的所有大寫字母。與來自正則表達式匹配的消息拋出異常

I然後想要在文本中引發第一個不支持的合併域的值。

  if (Regex.IsMatch(email.Body, @"\[[A-Z]+\]")) 
     { 
      var regexobj = new Regex(@"\[[A-Z]+\]"); 
      var regexBody = regexobj.Match(email.Body).Groups[1].Value; 
      throw new NotImplementedException("Unsupported Merge Field:"+ regexBody); 
     } 

現在我得到的例外,但唯一的消息是「不支持合併字段:」

+0

爲什麼要使用正則表達式呢?當你可以簡單地使用String.Contains(「[MERGEFIELD」)或者String.IndexOf(「[MERGEFIELD]」)''的時候,它是過度的。它只是爲了過度複雜的問題。 –

+0

也許我應該更清楚一點,我在mergefield中使用了大約25個不同的關鍵字(例如[FNAME]和[LNAME])。我希望它找到任何最終沒有以[[CAPITALLALLETTERSINHERE] – Subliminy

+0

@Subliminy格式解析所以你想找到任何東西看起來像括號括起來的大寫字母? – guanome

回答

2

您正試圖獲得(捕捉)1組(括號匹配的內容),這並不在你的表達存在的價值。

也許你想使用表達式像這個:

\[([A-Z]+)\] 
0

你需要以捕捉使用括號。

http://www.regular-expressions.info/refadv.html

參見,http://msdn.microsoft.com/en-us/library/az24scfc.aspx

我喜歡使用命名捕獲組這是在 (?<名>子表達式)格式,這將讓你的名字,而不是通過訪問捕獲指數。

喜歡的東西下面的(手工編碼)

if (Regex.IsMatch(email.Body, @"\[[A-Z]+\]")) 
    { 
     var regexobj = new Regex(@"(?<unsupportedField>\[[A-Z]+\])"); 
     foreach(Match match in regexobj.Matches(email.Body)) 
     { 
      string unsupported = match.Groups["unsupportedField"].Value 
      //aggregate these then throw 
     } 
     throw new NotImplementedException("Unsupported Merge Field:"+ regexBody); 
    } 
+0

命名捕捉組非常酷。我不知道,謝謝。 – Subliminy