2016-10-02 6 views
0

「2つの文字列の間に特定の文字列を見つけてリストに入れる」という質問があります。C#2つの文字列の間の特定の文字列をリストに入れる<string>

私はそのような文字列があります。

-begin- 
code:[264] 
Name:[1] 
Name:[2] 
Name:[3] 
-end- 
code:[264] 
Name:[1] 
Name:[4] 
code:[264] 
Name:[6] 
-begin- 
Name:[6] 
code:[264] 
Name:[7] 
Name:[8] 
Name:[1] 
-end- 

私は、文字列分割したい「名:」、以下のようにのようなリストに「 - 終わり - 」に「-begin-」との

list<1> 
Name:[1] 
Name:[2] 
Name:[3] 
list<2> 
Name:[6] 
Name:[7] 
Name:[8] 
Name:[1] 

"-begin-"から "-end-"までのテキストをリストに分割することしかできません。

int first = 0; 
int last = 0; 
int number = 0; 
int start = 0; 
    do { 
     first = text.IndexOf("-begin-", start); 
     last = text.IndexOf("-begin-", first + 1); 
     if (first >= 0 && last >= 0) 
      { 
       number = (last - first); 
       AVPline.Add(text.Substring(first,number).Trim()); 
       start = last + 1; 
      } 
    } while (position > 0); 

「-begin-」から「-end-」までのテキストを分割した後、文字列「名前」を分割することはできません。

誰か助けてもらえますか?

ありがとうございます。

+0

"名前:[3]"という行がある場合は、分割( ':')[1]を使用して[3]部分を取得します。それはあなたが求めていることですか? –

+0

まだ十分な情報がありません。例えば、 '' -begin- ''と '" -end- "'シーケンスは、 '' Name'フィールドの位置と決して一致していないようです。いくつかの 'Name'フィールドは、開始/終了ブロックの内部にあり、他のフィールドは開始/終了ブロックの内側にありません。それはやや不安です。サンプルデータが正確であれば、簡単に座って詳細な解析ロジックを自分で作成する必要があります。私たちが手助けできる技術的な問題(解析ロジック以外)はありません。 – code4life

答えて

1

String.Splitは、文字列を配列部分文字列に解析します。次に、部分文字列を処理します。

string[] parseStr = text.Split('\n'); 
+0

jim31415ありがとうございました。あなたのコードは文字列を各行に分割するのを簡単にしました。 –

1

あなたは列挙子とyield return Sを利用してよりクリーンで保守コードを達成することができます:すべての

まず、署名権を取得することができます。入力文字列からリストのコレクションを作成する必要があります。public static IEnumerable<IList<string>> ProcessText(string input)が正しく表示されます。

今、私たちの生活を楽にします。まず、ラインで入力文字列を分割することができます:

var lines = input.Split(new[] { Environment.NewLine }); 

は今、行を反復処理することができますが、これを行うにはforeachを使用しないことができます。少し汚れ取得し、ビットに明らかとなる理由のために直接列挙子を使用できます:

using (var enumerator = lines.GetEnumerator()) 
{ 
    while (enumerator.MoveNext() 
    { 
    } 
} 

[OK]を、今、私たちは、各サブリストの初めを見つけて、それに応じて構築する必要があります。簡単に:

while (enumerator.MoveNext() 
{ 
    if (enumerator.Current == "-begin-" 
     yield return createSubList(enumerator).ToList(); 
} 

これで、なぜ列挙子を直接使用するのか分かります。こうすることで、入力テキストのどこにあるのかを簡単に追跡できる別のメソッドを呼び出すことができます。

static IEnumerable<string> createSubList(IEnumerator<string> enumerator) 
{ 
    while (enumerator.MoveNext() 
    { 
     if (enumerator.Current == "-end-") 
     { 
      yield break; 
     } 

     if (!enumerator.Current.StartsWith(...whatever strings you want to ignore)) 
     { 
      yield return enumerator.Current; 
     }  
    } 
} 

これで完了です!すべて一緒に置いてみましょう:

public IEnumerable<IList<string>> ProcessText(string input) 
{ 
    var lines = input.Split(new[] { Environment.NewLine }); 

    using (var enumerator = lines.GetEnumerator()) 
    { 
     while (enumerator.MoveNext() 
     { 
      if (enumerator.Current == "-begin-" 
       yield return createSubList(enumerator).ToList(); 
     } 
    } 
} 

private static IEnumerable<string> createSubList(IEnumerator<string> enumerator) 
{ 
    while (enumerator.MoveNext() 
    { 
     if (enumerator.Current == "-end-") 
     { 
      yield break; 
     } 

     if (!enumerator.Current.StartsWith(...whatever strings you want to ignore)) 
     { 
      yield return enumerator.Current; 
     }  
    } 
} 
+1

列挙子を直接使うのは大変です! +1! –

+0

OPのサンプルテキストで想定しているように、入力文字列にNewLineが含まれている場合にのみ機能します。あなたのソリューションはよさそうだが、私はOPにとっては複雑すぎると思う。 –

+0

ありがとうございますInBetween、あなたのコードを使用した後、私はプログラムのこの部分を渡すことができますが、もっと質問があります。行間に文字列を見つけたい場合、 'enumerator.Current.StartsWith'を使うことはできません。 .Current.Indexof'かどうか? –

0

あなたの試行は、あまりにも遠く離れているわけではありません。
私は自分の携帯電話しか持っていないので、テストされたコードを与えることはできません。しかし、ここに私のアドバイスがあります:

  • あなたは文字列のリストを望んでいるようです。配列の大きさがわからないので、文字列のリストを作成してください。最後のリストから簡単に配列を取得することができます。
  • ループが必要です。あなたはすでにそれを持っています。
  • ループ内で、開始点と終了点を見つけます。あなたはほとんどそれをしています。文字列
  • のリストを作成

    • :あなたはそれがインナー(ネスト)ループ

    ネストされたループ内-begin--end-とプロセスの間で所望のデータを取るに-begin--end-

  • で検索します
  • のデータを取り出し、外側のループと同様に開始Nameと終了]を検索します。
  • 検索された要素をリストに追加します。
  • ネストされたループの後、まだ外側のループ内

  • あなただけの文字列のリストのリストに、満たされている、文字列のリストを追加します。

外側ループの終わり。

外部ループに有効な条件を使用することを忘れないでください。あなたのサンプルでは、​​あなたは決して「位置」を設定しません。

+0

あなたのコンセプトはとても明確で分かりやすくありがとうございます。 –

関連する問題