将字符串解析为键值对的简单方法

时间:2012-05-31 18:54:58

标签: c# string-parsing

让我说我有这样的类定义(相当简单):

class Person
{
  public string Balance;
  public string Escrow;
  public string Acc;
  // .. and more 

}

我需要将此字符串解析为上面的类:

BALANCE:      746.67     ESCROW PAYMENT:      271.22     LAST ACT:05/03/12
ACC: 10                   YTD DIVIDENDS:          .27   ENTRY DATE:12/20/10

字符串以这种奇怪的格式出现。

我正在考虑逐一阅读每一行并解析其内容,但我想学习更好的方法。至少2个大脑比一个大脑强。

2 个答案:

答案 0 :(得分:1)

如果字符串始终采用该格式,那么您应该能够将“:”字符拆分为数组并将其编入索引。

public Person ParsePerson(string line1, string line2) 
{
  string[] fields1 = line1.Split(new char[] {':', ' '}, StringSplitOptions.RemoveEmptyEntries);
  string[] fields2 = line2.Split(new char[] {':', ' '}, StringSplitOptions.RemoveEmptyEntries);
  return new Person() {
    Balance = fields1[1],
    Escrow = fields1[3],
    Acc = fields1[1]
  };
}

答案 1 :(得分:1)

您可以使用regular expression从源字符串中提取每个属性的值,如下所示:

using System.Text.RegularExpressions;
...
Regex balanceRegex = new Regex("(?<=BALANCE:\\s*)[^\\s]+");
string balance = balanceRegex.Match(source).Value;

这可以包含在函数中以搜索任何命名属性,如下所示:

private static string GetProperty(string source, string propertyName)
{
    string pattern = String.Format("(?<={0}:\\s*)[^\\s]+", propertyName);
    Regex regex = new Regex(pattern, RegexOptions.IgnoreCase);
    return regex.Match(source).Value;
}

然后你可以像这样填充一个Person对象:

Person person = new Person
{
    Balance = GetProperty(source, "Balance"),
    Escrow = GetProperty(source, "Escrow Payment"),
    Acc = GetProperty(source, "Acc")
};

您可能需要调整正则表达式,例如,如果您的 属性值为空格,例如ACCOUNT NAME: MR SMITH

正则表达式方法非常灵活,因为即使属性的顺序或空白量发生变化,它也会起作用。