1

我试图在电子邮件中找到未使用的合并字段并抛出解析器不支持的字段。格式为 [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 );
        }

现在我得到了例外,但只有消息是“不支持的合并字段:”

4

2 回答 2

2

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

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

\[([A-Z]+)\]
于 2012-06-07T20:59:46.630 回答
0

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

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

另请参阅http://msdn.microsoft.com/en-us/library/az24scfc.aspx

我喜欢使用格式为 (?< name > subexpression) 的命名捕获组,它可以让您按名称而不是按索引访问捕获。

类似下面的东西(手工编码)

    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 );
    }
于 2012-06-07T20:59:36.287 回答