2017-05-25 69 views
0

我想能够在变量的位置指示器上拆分格式化字符串。它会将花括号和表示它们之间的数字的位置切掉。
因此,该字符串:C#拆分string.format字符串与正则表达式

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

应解析为3串。

  • “字段需要设置为 '”
  • “' 当 ”
  • “,皿,现在!”

我们使用像上面'format'这样的字符串来构建错误消息。我的目标是添加可以采用格式的通用单元测试,并验证是否生成了与预期格式匹配的错误消息。由于错误生成代码和单元测试都引用相同的格式,因此在对消息进行较小更改时,不需要更新单元测试。

在上面的例子中,我可以通过调用一个名为SplitFormatString的新方法来测试预期的结果。

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

随着验证

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);    
    } 
} 

我宁愿使用正则表达式不是使用子的不雅方法。

+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

相关问题