【问题标题】:Extracting specific JSON out of large string using C# Regex使用 C# Regex 从大字符串中提取特定 JSON
【发布时间】:2016-01-30 05:41:18
【问题描述】:

这是一个示例字符串:

Lorem ipsum dolor sit amet, ad eam option suscipit invidunt, ius 适当的贬损铜。 Nec te wisi lo{"firstName":"John", "lastName":"Doe"}rem, in quo vocent erroribus {"firstName":"Anna", "lastName":"Smith"}异议。 At omittam pertinax senserit est, pri nihil alterum omittam ad, vix aperiam sententiae an.费里指责 eos, an facete tractatos moderatius sea{"firstName":"Peter", “姓氏”:“琼斯”}。 Mel ad sale utamur, qui ut oportere omittantur, facer ludus dicant 中的 eos。

假设存在以下数据模型:

public class Person
{
   public string firstName;
   public string lastName;
}

我如何使用正则表达式从该文本中提取 JSON 并创建一个 List<Person>

{"firstName":"John", "lastName":"Doe"},
{"firstName":"Anna", "lastName":"Smith"},
{"firstName":"Peter", "lastName":"Jones"}

对象可以隐藏在字符串中的任何位置,因此它们相对于单词、字母、标点符号、空格等的位置无关紧要。如果上面的 JSON 符号被破坏,只需忽略它。以下内容无效:

{"firstName":"John", "middleName":"", "lastName":"Doe"},
{"firstName":"Anna", "lastName":"Smith", "age":""},
{"firstName":"Peter", "lastName":"Jones" some text}

换句话说,模式搜索必须严格遵守以下几点:

{"firstName":"[val]", "lastName":"[val]"}

【问题讨论】:

  • 必须是正则表达式吗?使用过程代码可能更容易做到这一点。
  • 不,它不必是正则表达式。只需要完成它。
  • 您不应该将 Regex 与 JSON 等分层数据一起使用,原因与 XML 相同
  • 在 Micky 看来,嵌套 JSON 对象是否合法?我会假设是这样,这取决于它来自哪里。或者,同样令人沮丧的是,我假设您可能有一个包含花括号的字符串?我想没有人会拥有一个名字,但它是完全有效的 JSON。
  • 嵌套对象目前不是问题。啊,从来没有想过中间的花括号。我可以改为使用另一个符号或子字符串,并禁止用户输入它。

标签: c# json regex


【解决方案1】:

这是一个可用于提取值的正则表达式:

({\s*"firstName":\s*"[^"]+",\s*"lastName":\s*"[^"]+"\s*})

在此之后,我建议只使用 Json.NET 来反序列化对象。

【讨论】:

  • 只是澄清一下,这是否简单(打开大括号 + 任意数量的不关闭大括号的字符 + 关闭大括号)?如果中间有另一个开口花括号怎么办?此外,firstName 和 lastName 应该是硬编码的。
  • 这似乎没有为我返回匹配项。需要括号吗?另外,逗号后面还有一个空格。
  • 括号是返回匹配的内容。 \s 匹配空格。这只是正则表达式,您必须正确转义 C# 字符串中的反斜杠和引号。这是它有效的证明:regex101.com/r/rO7bK2/1
  • 太棒了。我能想办法逃跑了!
【解决方案2】:

使用这个代码sn-p,

//Take All first Name
    string strRegex1 = @"firstName"":""([^""""]*)"",";
//Take All Last Name
    string strRegex2 = @"lastName"":""([^""""]*)""";
    Regex myRegex = new Regex(strRegex, RegexOptions.None);
   Regex myRegex2 = new Regex(strRegex2, RegexOptions.None);
    string strTargetString = @"{""firstName"":""John"", ""middleName"":"""", ""lastName"":""Doe""}," + "\n" + @"{""firstName"":""Anna"", ""lastName"":""Smith"", ""age"":""""}," + "\n" + @"{""firstName"":""Peter"", ""lastName"":""Jones"" some text}";

    foreach (Match myMatch in myRegex.Matches(strTargetString))
    {
      if (myMatch.Success)
      {
       // Add your code here for First Name
      }
    }

foreach (Match myMatch in myRegex2.Matches(strTargetString))
    {
      if (myMatch.Success)
      {
        // Add your code herefor Last Name
      }
    }

【讨论】:

    猜你喜欢
    • 2021-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多