2017-05-25 3 views
0

変数の位置インジケータに書式設定文字列を分割したいと考えています。中括弧とそれらの間の位置を示す位置番号が切り取られます。
ので、文字列:C#split string.format正規表現による文字列

string format = "{0} field needs to be set to '{1}' when {2}, Fixit. NOW!"; 

が3列に解決する必要があります。

  • ' "と、 "
  • "フィールドがに設定する必要があります"'" NOW、フィックスイット!"

上記の 'format'のような文字列を使用してエラーメッセージを作成します。私の目標は、形式をとることができ、予想される形式に一致するエラーメッセージが生成されたことを確認できる一般的な単体テストを追加することです。エラー生成コードとユニットテストの両方が同じフォーマットを参照するため、メッセージに軽微な変更が加えられたときにユニットテストを更新する必要はありません。

上記の例では、SplitFormatStringという新しいメソッドを呼び出すことで、期待される結果をテストできます。私はむしろストリングを使用して洗練アプローチよりも、正規表現を使用すると思い検証

public static void AssertStringContainsAllThese(string msg, string[] formatChunks, params string[] thingsToFind) 
{ 
    foreach (var txt in formatChunks.Concat(thingsToFind)) 
    { 
    Assert.IsTrue(msg.Contains(txt), "Could not find <<" + txt + ">> in msg >>> " + msg);    
    } 
} 

string fieldName = "UserName"; 
string expectedValue = "Bob"; 
string condition = "excellence is a must"; 
string errorMessage = TestFieldValueErrorCase(); 
AssertStringContainsAllThese(errorMessage, SplitFormatString(format), fieldName, expectedValue,condition); 

+2

[?このよう](https://regex101.com/r/VYXYT8/1)、その後、ちょうど '\ N 'に分割? – Olian04

+0

はい、そうです。 Thx – rediVider

答えて

3

は、私はあなたがRegex.Split

は、正規表現パターンによって定義された位置での部分文字列の配列に入力文字列を分割したいと思います。

Regex.Split("{0} field needs to be set to '{1}' when {2}, Fixit. NOW!", @"{\d+}"); 

万一出力:

["","field needs to be set to '","' when ",", Fixit. NOW!"] 
+0

空の文字列を取り除くために更新できますか? – rediVider

+0

確かに '.Where(s =>!string.isNullOrWhitespace(s))'です。 – gbishop3