使用正则表达式匹配的消息抛出异常

时间:2012-06-07 20:53:13

标签: c# regex

我正在尝试在电子邮件中找到未使用的合并字段,并抛出解析器不支持的字段。格式为[MERGEFIELD]。括号内的所有大写字母。

我然后想要在文本中抛出第一个不受支持的合并字段的值。

            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 );
        }

现在我得到了异常,但只有消息是“Unsupported Merge Field:”

2 个答案:

答案 0 :(得分:2)

您正试图获取(捕获)第1组(括号中的匹配内容)的值,这在您的表达式中不存在。

也许您想要使用这样的表达式:

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

答案 1 :(得分:0)

您需要使用括号才能捕获。

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

另见http://msdn.microsoft.com/en-us/library/az24scfc.aspx

我喜欢使用格式为的命名捕获组 (?< name>子表达式),它允许您按名称而不是索引访问捕获。

类似下面的内容(手工编码)

    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 );
    }