0

このようなクラス定義があるとしましょう (かなり単純です):

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

文字列は、この奇妙な形式で提供されます。

各行を 1 行ずつ読んでその内容を解析することを考えていますが、もっと良い方法を学びたいと思っています。少なくとも 2 つの脳は、1 つの脳よりも強力です。

4

2 に答える 2

1

次のように正規表現を使用して、ソース文字列から各プロパティの値を抽出できます。

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

プロパティの順序や空白の量が変わっても機能するため、正規表現のアプローチは非常に柔軟です。

于 2012-05-31T20:21:02.797 に答える
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]
  };
}
于 2012-05-31T18:58:18.417 に答える