2017-03-10 5 views
1

文字列を文字列の配列に分割しようとしています。現在、私はmyString.Split(arrayOfWordsToSplitOn, StringSplitOptions.RemoveEmptyEntries)を使用していますが、これは文字列を分割しますが、実際に分割している単語は含まれていません。文字列の配列を分割し、Cで最後の配列に分割するための単語を含める

たとえば、文字列"My cat and my dog are very lazy"と文字列配列{"cat", "dog"}がある場合は、すぐに{"My", "and my", "are very lazy"}を返します。

しかし、私は最終的な出力を{"My", "cat", "and my", "dog", "are very lazy"}にしたいと思います。これを行う方法はありますか?

+1

正規表現を使用できます。 –

+0

単語境界または部分文字列に分割しますか?あなたの現在の 'String.Split'アプローチは後者を行います –

+0

Regex.Split(s、string.Format(@" \ b({0})\ b "、string.Join(" | "、arrayOfWordsToSplitOn)))' –

答えて

4

検索ワードのリストから代替正規表現を作成し、その部分をキャプチャグループ(...)でラップすることができます。その後、グループの周りの空白を取り除くとRegex.Splitを使用するように\s*を追加します。

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Text.RegularExpressions; 

public class Test 
{ 
    public static void Main() 
    { 
     var arrayOfWordsToSplitOn = new List<string> { "cat", "dog" }; 
     var s = "My cat and my dog are very lazy"; 
     var pattern = string.Format(@"\s*\b({0})\b\s*", string.Join("|", arrayOfWordsToSplitOn)); 
     var results = Regex.Split(s, pattern).Where(x => !String.IsNullOrWhiteSpace(x)).ToList(); 
     foreach (var res in results) 
      Console.WriteLine(res); 
    } 
} 

C# demoを参照してください。

結果:

My 
cat 
and my 
dog 
are very lazy 

NOTES:

  • 検索語は、非単語の文字を含めることができる場合、パターンは\b(ワード境界)のように調整しなければならないが、一致を失敗する可能性があり、検索 "words"はRegex.Escape d
  • である必要があります。単語境界を削除する場合は、検索語の配列に長さとアルファベットによるソートが必要な場合があります。
+0

素晴らしい答え、それはとても簡単になります –

+1

これはうまくいった!ありがとうございました! – OstrichGlue

関連する問題