3

以下にリストされているような文字列があります。

文字列サンプル = " class0 .calss1 .class2 .class3.class4 .class5 class6 .class7";

このサンプル文字列から WORDS のリストを作成する必要があります。

WORD は、ピリオドで始まり、次の文字列で終わる文字列です。

  1. スペースまたは
  2. 別の期間または
  3. 文字列の終わり

: ここで重要な点は、分割は 2 つの基準 (ピリオドと空白スペース) に基づいているということです。

次のプログラムがあります。それは正常に動作します。ただし、 or を使用したよりシンプル/効率的/簡潔なアプローチはありますLINQRegular Expressions?

コード

        List<string> wordsCollection = new List<string>();
        string sample = " class0 .calss1 .class2 .class3.class4  .class5 class6 .class7";

        string word = null;

        int stringLength = sample.Length;
        int currentCount = 0;

        if (stringLength > 0)
        {
            foreach (Char c in sample)
            {

                currentCount++;
                if (String.IsNullOrEmpty(word))
                {
                    if (c == '.')
                    {
                        word = Convert.ToString(c);
                    }
                }
                else
                {

                    if (c == ' ')
                    {
                        //End Criteria Reached
                        word = word + Convert.ToString(c);
                        wordsCollection.Add(word);
                        word = String.Empty;
                    }
                    else if (c == '.')
                    {
                        //End Criteria Reached
                        wordsCollection.Add(word);
                        word = Convert.ToString(c);
                    }
                    else
                    {
                        word = word + Convert.ToString(c);
                        if (stringLength == currentCount)
                        {
                            wordsCollection.Add(word);
                        }
                    }
                }

            }
        }

結果

        foreach (string wordItem in wordsCollection)
        {
            Console.WriteLine(wordItem);

        }

ここに画像の説明を入力

参照:

  1. 述語に基づく文字列の分割
  2. 各項目が述語に一致するサブシーケンスを取得するより良い方法はありますか?
  3. Predicate<T> に代わる Linq ベースのジェネリック?
4

4 に答える 4

5

これは正規表現で行うことができます。

コード

Regex regex = new Regex(@"\.[^ .]+");
var matches = regex.Matches(sample);
string[] result = matches.Cast<Match>().Select(x => x.Value).ToArray();

オンラインでの動作を確認してください: ideone

結果

.calss1
.class2
.class3
.class4
.class5
.class7

正規表現の説明

\. ドットを合わせる
[^。]+ 負の文字クラス - スペースまたはドット以外 (少なくとも 1 つ)

関連している

于 2012-12-21T15:12:11.650 に答える
2
string sample = " class0 .calss1 .class2 .class3.class4  .class5 class6 .class7";

string[] words = sample.Split(new char[] {'.'}).Skip(1).Select(x=> 
            "." + x.Split(new char[] {' '})[0].Trim()).ToArray();

EDITはリスト部分を逃しました:

List<string> words = sample.Split(new char[] {'.'}).Skip(1).Select(x=> 
            "." + x.Split(new char[] {' '})[0].Trim()).ToList();
于 2012-12-21T15:41:16.063 に答える
0

を保持する必要がありますか。そしてスペース?

そうでない場合は、次を使用できます。

sample.split(new char[]{" ", "."}).ToList();

これにより、文字列のリストが表示されます。

于 2012-12-21T15:13:43.197 に答える
0
string sample = " class0 .calss1 .class2 .class3.class4 .class5 class6 .class7";
sample = Regex.Replace(sample, " ", String.Empty);
string[] arr = sample.Split(new char[] { '.' });
于 2012-12-21T15:33:04.480 に答える