使用正则表达式提取双引号之间的值

时间:2016-08-31 21:31:03

标签: c# asp.net regex regex-lookarounds regex-greedy

string emailBody = "sample text for NewFinancial History:\"xyz\"  text NewFinancial History:\"abc\"  NewEBTDI$:\"abc\" ds \"NewFinancial History:pqr\" test";

private Dictionary<string, List<string>> ExtractFieldValuesForDynamicListObject(string emailBody)
        {
         Dictionary<string, List<string>> paramValueList = new Dictionary<string, List<string>>();
            try
            {
                emailBody = ReplaceIncompatableQuotes(emailBody);
                emailBody = string.Join(" ", Regex.Split(emailBody.Trim(), @"(?:\r\n|\n|\r)"));
                var keys = Regex.Matches(emailBody, @"\bNew\B(.+?):", RegexOptions.Singleline).OfType<Match>().Select(m => m.Groups[0].Value.Replace(":", "")).Distinct().ToArray();
                foreach (string key in keys)
                {
                    List<string> valueList = new List<string>();
                    string regex = "" + Regex.Escape(key) + ":" + "\"(?<" + Regex.Escape(GetCleanKey(key)) + ">[^\"]*)\"";

                    var matches = Regex.Matches(emailBody, regex, RegexOptions.Singleline);
                    foreach (Match match in matches)
                    {
                        if (match.Success)
                        {
                            string value = match.Groups[Regex.Escape(GetCleanKey(key))].Value;
                            if (!valueList.Contains(value.Trim()))
                            {
                                valueList.Add(value.Trim());
                            }
                        }
                    }
                    valueList = valueList.Distinct().ToList();
                    string listName = key.Replace("New", "");                    
                    paramValueList.Add(listName.Trim(), valueList);
                }
            }
            catch (Exception ex)
            {
                DCULSLogger.LogError(ex);
            }
            return paramValueList;
        }

我的目标是扫描电子邮件正文并使用NewListName识别字符串:“值”命名法,并且使用上述正则表达式和方法完美地工作。现在我的客户端已将命名规则从NewListName:“Value”更改为“NewListName:Value”。我想抓住双引号和New:关键字之间的文本。所以我需要寻找“新关键字和”结尾引号。任何人都可以帮我修改上面的正则表达式来扫描电子邮件正文并获得双引号之间的所有值列表。所以在上面的例子中我想在我的结果中抓住“NewFinancial History:pqr \”。任何帮助,将不胜感激。

1 个答案:

答案 0 :(得分:1)

您可以使用与引号,New匹配的正则表达式,除":以外的一些字符,然后:,然后使用{{1}以外的任何字符最多"

"

请参阅regex demo

enter image description here

模式详情

  • var keys = Regex.Matches(emailBody, @"""New[^"":]+:[^""]+""", RegexOptions.Singleline) .OfType<Match>() .Select(m => m.Value) .Distinct() .ToArray(); - 文字双引号
  • " - 文字子字符串
  • New - 除[^":]+"以外的1个或多个字符(:否定的字符类
  • [^...] - 字面冒号
  • : - 除[^"]+
  • 以外的1个或多个字符
  • " - 文字双引号