【问题标题】:How can I get and split a part of string in C#?如何在 C# 中获取和拆分字符串的一部分?
【发布时间】:2018-09-11 14:56:40
【问题描述】:

我希望每个 <div class="person"> { /*JSON stuff/* } 成为对象列表中的一个单独元素。它与其他 html 内容混合在一起(...html tags...)。我有一个来自 html 文件的字符串:

...html tags...
<div class="person">
{
    "name":"Bob",
    "age":20,
    "color":"blue"
}
</div>
...html tags...
<div class="person">
{
    "name":"John",
    "age":30,
    "color":"green"
}
</div>
...html tags...

无法预测会有多少人。我认为我会使用 Regex、Json 或 Substring。我的问题是这些人周围还有许多其他内容,我不知道将每个元素作为对象列表中的单独元素的最简单解决方案是什么。

例如我有一个这样的类:

class Person
{
    public string name {get;set;}
    public int age {get;set;}
}

我想从这个 html 上传List&lt;Person&gt; 列表。

【问题讨论】:

  • 这是什么鬼? HTML 中的 Json?
  • 您的介绍句讨论了重复,您想消除哪些重复?有同名的div吗?任何具有所有相同属性的 div?
  • (从您向我们展示的内容来看)您在谈论什么以及您想做什么并不明显。您谈论拆分字符串。什么字符串(或字符串)?您能否向我们展示一个“包含重复”的示例,以及发生这种情况时您想做什么。
  • 我同意上述所有 cmets。但是,如果您试图从 html 中获取“JSON”,我会使用某种 JavaScript 首先从页面中提取 JSON,然后将其发布回后端(可能是 ASP.NET/Core C#代码)。使用 JQuery,您可以执行类似 var obj = $.parseJSON($('.person').val()) 的操作,然后使用 api/ajax 调用在后端处理它
  • @KJohnson 我的字符串中有一个 html 内容。在此内容中包含带有 &lt;div class="person"&gt; 之类的潜水课程。这就是重复。这就是我想要获取并将其元素拆分为列表的内容。

标签: c# string object split tags


【解决方案1】:

看看这是否有帮助...

using System;
using System.Linq;
using System.Text.RegularExpressions;

using Newtonsoft.Json;

namespace ConsoleApp1 {
    class Program {
        static void Main(string[] args) {

            // Just get your input loaded into a variable called input
            var input = @"
                <div class='person'>
                {
                    'name':'Bob',
                    'age':20,
                    'color':'blue'
                }
                </div>
                <div class='dog'>
                {
                    'name':'Jim',
                    'age':30,
                    'color':'green'
                }
                </div>
                <div class='person'>
                {
                    'name':'John',
                    'age':30,
                    'color':'green'
                }
                </div>
            ".Replace("'", "\"");

            Regex personContents = new Regex("<div class=\"person\">(.+?)</div>", RegexOptions.Singleline);
            var persons = personContents.Matches(input).Cast<Match>().Take(6).Select(x => JsonConvert.DeserializeObject<Person>(x.Groups[1].Value.Trim())).ToArray();
            var names = string.Join(",", persons.Select(x => x.name));
            Console.WriteLine($"names={names}");
        }

        class Person {
            public string name { get; set; }
            public int age { get; set; }
            //public string color { get; set; }
        }
    }
}

上面的代码打印出“Bob,John”。这并没有解决过滤掉重复项的问题,但是使用 LINQ 的 Distinct() 方法可以很容易地仅获取唯一记录。

【讨论】:

  • 谢谢,它很有帮助,但我在 linq 收到此错误:'MatchCollection' does not contain a definition for 'Select' and no extension method 'Select' accepting a first argument of type 'MatchCollection' could be found (are you missing a using directive or an assembly reference?)。输入/字符串与其他 html 内容混合。你有什么想法,我怎样才能得到它(输入)?我尝试使用indexOf()Substring(),但没有成功。
  • 好的,如果我使用Cast&lt;Match&gt;(),我不会收到错误消息,例如:jsonItems.Matches(input).Cast&lt;Match&gt;().Select...
  • 您知道如何专门反序列化 (JSON) 个人类吗?我可以限制反序列化的元素数量吗?例如仅前 6 个结果。
  • 是的,将行更改为var persons = jsonItems.Matches(input).Take(6).Select(x =&gt; JsonConvert.DeserializeObject&lt;Person&gt;(x.Groups[0].Value)).ToArray(); 以仅处理前六个。
  • 谢谢!您能帮我如何更改此正则表达式以仅获取 {} 之间的名称和年龄属性吗?这就是我尝试的方式,但不是一个好的解决方案:^.*\b(name|age|{|})\b.*$
猜你喜欢
  • 1970-01-01
  • 2015-02-02
  • 1970-01-01
  • 1970-01-01
  • 2020-01-15
  • 1970-01-01
  • 2016-04-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多