【问题标题】:Extract the values between the double quotes using regex使用正则表达式提取双引号之间的值
【发布时间】:2020-01-21 05:25:38
【问题描述】:
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:"Value" 命名法识别字符串,使用上述正则表达式和方法可以正常工作。现在我的客户已将命名法从 NewListName:"Value" 更改为 "NewListName:Value"。我想抓取双引号之间的文本以及 New: 关键字。所以我需要寻找 "New 关键字和结束引号。谁能帮我修改上面的正则表达式以扫描电子邮件正文并获取双引号之间的所有值列表。所以在上面的例子中,我想在我的结果中获取\"NewFinancial History:pqr\"。任何帮助,将不胜感激。

【问题讨论】:

  • 试试var keys = Regex.Matches(emailBody, @"""New[^"":]+:[^""]+""", RegexOptions.Singleline).OfType&lt;Match&gt;().Select(m =&gt; m.Value).Distinct().ToArray();
  • 成功了。谢谢 !!!你能解释一下正则表达式吗?
  • 太好了,请检查下面的答案,我发布了解释。

标签: c# regex


【解决方案1】:

您可以使用正则表达式来匹配引号New、除": 之外的一些字符,然后是:,然后是除" 之外的任何字符,直到":

var keys = Regex.Matches(emailBody, @"""New[^"":]+:[^""]+""", RegexOptions.Singleline)
       .OfType<Match>()
       .Select(m => m.Value)
       .Distinct()
       .ToArray();

regex demo

模式详情

  • " - 文字双引号
  • New - 文字子串
  • [^":]+ - 除了": 之外的1 个或多个字符([^...] 是一个否定字符类
  • : - 文字冒号
  • [^"]+ - 除" 之外的 1 个或多个字符
  • " - 文字双引号

【讨论】:

  • 非常感谢。你说的很对。感谢您的帮助。
猜你喜欢
  • 2015-05-28
  • 2012-02-09
  • 2010-09-15
  • 1970-01-01
  • 2019-04-15
  • 1970-01-01
  • 2013-04-12
相关资源
最近更新 更多