2012-02-15 18 views
0

私は時間の99%を含むことができる文字列を持っていますが、英語の文章がいくつかあります。.Net文字列内のすべての単語オフセットを見つける

私はその文字列を取って、各単語の先頭を表すインデックスのリストを取得する必要があります(または、別の方法で、各空白部分の最後に置く必要があります)。空白の定義が必要な場合は、少なくともスペース、CR、LF、および期間。

これを行う最も簡単な方法は何ですか? Forループよりも良い方法があると思います - ラムダを使用することを考えていましたが、再帰的ではない方法はありません。それはスタックオーバーフローを募集しているようです。

サンプルデータ:

Peter Piper picked a peck 
of pickled peppers 

所望の出力は、以下の数字です。例の横のコメント:

6, 'Peter ' 
12, 'Peter Piper ' 
19, 'Peter Piper picked ' 
21, 'Peter Piper picked a ' 
26, 'Peter Piper picked a peck[CR]' 
29, 'Peter Piper picked a peck[CR]of ' 
37 'Peter Piper picked a peck[CR]of pickled ' 
+0

私は、forループシンプルでいいと思います。あなたはlinqを使うことができますが、この場合は遅くて醜いでしょう。 – CodesInChaos

+1

例データと望ましい出力が役立ちます。 – Alan

+0

@Alan良い点 - 編集。 – Basic

答えて

2

ここには、正規表現ラムダを組み込んだ1つの方法があります。これは、最も効率的な手法ではないかもしれないが、それは素敵な、宣言型のワンライナーです:

var indices = Regex.Matches(inputString, @"[^\s\.]+") 
        .Cast<Match>() 
        .Select(match => match.Index) 
        .ToArray(); 
+0

非常にエレガント - 私はあなたにリワードする必要がありました。 – Basic

1

この場合は、より良い主観的になるでしょう。おそらく、私は一行のコードを使うことができますが、値のインデックスを知る必要があるので、単純なforループは速く書けるようになり、保守はずっと簡単になります。

あなたのケースに十分適していると思われるO(n)のパフォーマンスを考えれば、forループを使って次の問題に進むと言います。

+0

公正なポイント - 私は明らかに私の手にあまりにも多くの時間を持っています:) – Basic

1

次の関数は、あなたがforループせずに必要なものを行います。それはしかし実際には短いですわからない;)

static List<int> FindWordStarts(string sentence, Func<char, bool> is_separator) { 

    var indexes = new List<int>(); 
    bool separator = true; 

    sentence.Aggregate(
     0, 
     (index, c) => { 
      if (is_separator(c)) 
       separator = true; 
      else if (separator) { 
       indexes.Add(index); 
       separator = false; 
      } 
      return ++index; 
     } 
    ); 

    return indexes; 

} 

このようにそれを使用します。

string sentence = "Peter Piper picked a peck\rof pickled peppers"; 
var indexes = FindWordStarts(sentence, c => Char.IsWhiteSpace(c) || Char.IsPunctuation(c)); 
foreach (int index in indexes) 
    Console.WriteLine(index); 

そして結果は次のとおりです。

0 
6 
12 
19 
21 
26 
29 
37 
+0

+1 - 場所全体の状態変数を持つforループよりもきれいで読みやすい – Basic

関連する問題