如何分割特定格式的字符串并将其分配给c#中的变量?

问题描述 投票:-2回答:3

我是C#的新手,将需要一些有关如何解决以下问题的建议。

我有以下内容。

string input = "{1, 'hello', 1, 3}, {2, 'othello', 0, 2}"

在某些情况下,输入字符串中可能只有一个{}或更多。

我希望能够在两个或多个{}上拆分输入字符串,并创建Data类的实例,并将每个新实例添加到List<Data> mydatalist()

我具有Data类的以下声明。我不确定如何拆分输入字符串并从中创建Data类实例。

public partial class Data
{
    private:
    int id;
    string desc;
    int state;
    int res;

    public:
    Data(int idval, string indesc, int instate, int inres)
    {
        id=idval; desc=indesc; state=instate; res=inres; 
    }
}

最后,我的List<Data> mydatalist()将包含两个Data类对象,并相应地声明了各自的字段。

void CreateInstances(string result)
{
   var temp = result.Split(); // This gives me every index?
}

任何帮助将不胜感激。

c#
3个回答
0
投票
  • 对于重复的{ <number>, <string>, <number>, <number> }部分使用正则表达式。
  • 我强烈建议您使用不可变的POCO而不是像代码那样使用可变类型。
  • [您说过,您是C#的新手,但我不知道您是否是Genreal中的正则表达式和解析的新手,但是正则表达式会“匹配”您的输入文本,并允许程序从中提取数据。将其视为您可能已经看到的通配符或全局搜索"foo*.txt"的更强大形式。
    • [(\d+)表示“匹配十进制数字”]
    • \s*的意思是“在这里期待可选的空格”
    • '(.*?)'的意思是“将两个引号之间的每个字符作为一个值读取”
    • 您可以在这里在线尝试:https://regex101.com/r/mesMGG/1
  • Match.NextMatch()方法和Match.Successful属性允许同一正则表达式在输入字符串上多次运行。
  • 匹配的文本作为String中的Match.Groups[]值返回。
    • 请注意,Match.Groups[0]始终是整个输入字符串,这就是为什么我的代码从索引1而不是0开始的原因。
    • 因为它们是String值,所以需要使用Int32.ParseInt32.TryParse将它们转换为Int32值。

例如:

class Data
{

    public Data( Int32 id, String description, Int32 state, Int32 res )
    {
        this.Id = id;
        this.Description = description;
        this.State = state;
        this.Res = res;
    }

    public Int32 Id { get; }
    public String Description { get; }
    public Int32 State { get; }
    public Int32 Res { get; }
}

public static List<Data> ParseData( String input )
{
    RegEx r = new Regex( @"\{\s*(\d+)\s*,\s*'(.*?)'\s*,\s*(\d+)\s*,\s*(\d+)\s*\}" );

    List<Data> list = new List<Data>();

    Match m = r.Match( input );
    while( m.Success )
    {
        Int32  id    = Int32.Parse( m.Groups[1].Value, NumberStyles.Integer, CultureInfo.InvariantCulture );
        String desc  = m.Groups[2].Value;
        Int32  state = Int32.Parse( m.Groups[3].Value, NumberStyles.Integer, CultureInfo.InvariantCulture );
        Int32  res   = Int32.Parse( m.Groups[4].Value, NumberStyles.Integer, CultureInfo.InvariantCulture );

        Data d = new Data( id, desc, state, res );
        list.Add( d );

        m = m.NextMatch();
    }

    return list;
}

使用方式如下:

List<Data> list = ParseData( "{1, 'hello', 1, 3}, {2, 'othello', 0, 2}" );

-1
投票

如果使用Newtonsoft JSON.NET并将输入更改为JSON:

string dataString = "[{id: 1, desc: "hello", state: 1, res: 3}, {id: 2, desc: "othello", state: 0, res: 2}]"
var dataObject = Newtonsoft.Json.JsonConvert.DeserializeObject<Data>(dataString );

-1
投票

这应该有帮助。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;

(...)

public static void Main(string[] args)
{

    string input = "{1, 'hello', 1, 3}, {2, 'othello', 0, 2}";
    var pattern = "{(.*?)}";
    var matches = Regex.Matches(input, pattern);

    var separated = matches
                .Select(m => m.Groups[1].ToString())
                .ToList();

    var os = new Program().CreateInstances(separated).ToList();
}

IEnumerable<Data> CreateInstances(IEnumerable<string> separated)
    => separated.Select(o =>
        {
            var parts = o.Split(',').Select(s => s.Trim()).ToList();
            return new Data(
                int.Parse(parts[0]),
                parts[1].Trim('\''),
                int.Parse(parts[2]),
                int.Parse(parts[3]));
        });
© www.soinside.com 2019 - 2024. All rights reserved.