5

私が直面している問題を少し視覚化するために、コードを前もって作成します。

  1. これは分割する必要のあるテキストです。
:20:0444453880181732
:21:0444453880131350
:22:CANCEL/ABCDEF0131835055
:23:BUY/CALL/E/EUR
:82A:ABCDEFZZ80A
:87A:4444655604
:30:061123
:31G:070416/1000/USNY
:31E:070418
:26F:PRINCIPAL
:32B:EUR1000000,00
:36:1,31000000
:33B:USD1310000,00
:37K:PCT1,60000000
:34P:061127USD16000,00
:57A:ABCDEFZZ80A

これは私の正規表現です

 Regex r = new Regex(@"\:\d{2}\w*\:", RegexOptions.Multiline);

 MatchCollection matches = r.Matches(Content);
 string[] items = r.Split(Content);

 // ----- Fix for first entry being empty string.
 int index = items[0] == string.Empty ? 1 : 0;

 foreach (Match match in matches)
 {
    MessageField field = new MessageField();

    field.FieldIdExtended = match.Value;
    field.Content = items[index];

    Fields.Add(field);

    index++;
 }

コメントからわかるように、問題は文字列の分割で発生します。最初の項目として空の文字列を返します。これを解決するためのエレガントな方法はありますか?

ありがとう、ディミ

4

2 に答える 2

4

この動作が発生する理由は、分割からの最初の区切り文字の前に何も存在せず、この最初のエントリが空白であるためです。

これを適切に解決する方法は、正規表現で必要な値をキャプチャして、マッチセットから取得することです。

大まかな最初の推測では、おそらく次のようなものが必要です。

Regex r = new Regex(@"^:(?<id>\d{2}\w*):(?<content>.*)$", RegexOptions.Multiline);

MatchCollection matches = r.Matches(Content);

foreach (Match match in matches)
{
    MessageField field = new MessageField();

    field.FieldIdExtended = match.Groups["id"].ToString()
    field.Content = match.Groups["content"].ToString();

    Fields.Add(field);

}

名前付きキャプチャグループを使用すると、コンテンツを簡単に抽出できます。必要に応じて正規表現を微調整する必要がある場合があります。現在20、idおよび0444453880181732contentとして取得されます。何をキャプチャする必要があるかは100%明確ではありませんでしたが、正規表現で問題ないように見えるので、問題はないと思います。:)

基本的に、ここでは実際に分割しようとしているのではなく、一致させて引き出します。

于 2012-08-23T14:15:12.920 に答える
-3

使用する:

string[] items = r.Split(Content, StringSplitOptions.RemoveEmptyEntries);

空のエントリを削除します。

于 2012-08-23T14:04:09.207 に答える