如何解析没有定界符的键值对的字符串?

时间:2019-09-30 22:19:17

标签: c# .net regex parsing string-search

如何在C#中解析字符串以提取键值对,而键和值之间没有任何定界符?

我有一个看起来像这样的字符串

string[] properties = ["FIRSTNAMEJOHN","LASTNAMESMITH", etc.]

在\ n分割后,我得到了一个看起来像

的字符串集合
Person person = new Person() 
{ FIRSTNAME = JOHN,
  LASTNAME = SMITH,
  etc...
}

我想遍历这些字符串的拆分数组,并从每个单独的字符串中提取键值对,这样我就可以填充对象的属性,例如...

if (Stream.of(key1, key2, key3, key4).anyMatch(rqstCriteria::contains) ||
    rqstCriteria.contains(key5) && 
    anotherCriteria != null && 
    Stream.of(key1, key2, key3, key4, key5).anyMatch(anotherCriteria::contains))
{} 

最干净的方法是什么?谢谢!

1 个答案:

答案 0 :(得分:4)

您可以创建一个具有这些属性的类,然后通过反射获取对象的属性(因此我们可以使用循环),在\n字符上分割字符串,然后为每个属性分配每个设置(如果设置以属性名称开头),请根据其余设置字符串设置属性值。

例如:

class User
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Address { get; set; }
    public string BirthDate { get; set; }

    public override string ToString()
    {
        return $"{FirstName} {LastName}, born on {BirthDate}, lives at: {Address}";
    }
}

public class Program
{
    static void Main(string[] args)
    {
        string str = "\nFIRSTNAMEJOHN\nLASTNAMESMITH\nADDRESS1590 GRACE STREET\nBIRTHDATE04201969";
        var user = new User();
        var properties = typeof(User).GetProperties();
        var settings = str.Split('\n');

        foreach (var property in properties)
        {
            foreach (var setting in settings)
            {
                if (setting.StartsWith(property.Name, StringComparison.OrdinalIgnoreCase))
                {
                    property.SetValue(user, setting.Substring(property.Name.Length));
                    break;
                }
            }
        }

        Console.WriteLine(user);

        GetKeyFromUser("\n\nDone! Press any key to exit...");
    }
}

输出

enter image description here