我从一个web api接收到一个字符串,该字符串已经是类似string.Format的格式。收到的字符串可以是:
"{0} (Length required 20)"
"{0} {1} (Length required 20)(Mandatory)"
是否可以创建一个与相等的
String.Format("{0}","Length required 20");
String.Format("{0} {1}","Length required 20","Mandatory");
从这些字符串
这应该会对您有所帮助。首先,您需要这个方法从字符串中提取集合:
public static MatchCollection GetMatchedCollections(string stringToSearch, string pattern)
{
var regex = new Regex(pattern, RegexOptions.IgnoreCase);
return regex.Matches(stringToSearch);
}
然后您需要两个正则表达式:
- ({[0-9]+}(+
- ([a-zA-Z].*?(
因此,对于字符串{0} {1} (Length required 20)(Mandatory)
,以上每一项都将分别如下提取到集合中:
- {0}{1}
- (要求长度20((强制要求(
所以要使用上述方法,你所要做的就是:
var masterString = "{0} {1} (Length required 20)(Mandatory)";
var curlyBracesGroups = GetMatchedCollections(masterString, @"({[0-9]+})+");
var bracketsGroups = GetMatchedCollections(masterString, @"(([a-zA-Z].*?))");
var curlyBraceGroupStr = "";
foreach(var curlyBraceGroup in curlyBracesGroups)
{
curlyBraceGroupStr += curlyBraceGroup + " ";
}
var bracketGroup1 = bracketsGroups[0].Value;
var bracketGroup2 = bracketsGroups[1].Value;
这将导致:
- curlyBraceGroupStr----->{0}{1}
- 括号组1------>(要求长度20(
- 括号组2------>(必须(
p.S:您还需要编写一个方法,该方法可以根据参数的数量调用String.Format("{0} {1}","Length required 20","Mandatory");
。请注意,String.Format
接受类型为params obj[]
的参数。创建可以正确调用string.Format
的方法应该很容易。然而,如果你有任何问题,请为它单独发布一个问题,因为它确实需要自己的标题。类似于这个问题的东西。
编辑:以下是操作的注释
我最终使用了基于您的解决方案的代码:
public string GetToolTipString(string validatorTooltip)
{
MatchCollection curlyBracesGroups = GetMatchedCollections(validatorTooltip, @"({[0-9]+})+");
MatchCollection bracketsGroups = GetMatchedCollections(validatorTooltip, @"(([a-zA-Z].*?))");
string curlyBraceGroupStr = "";
foreach (var curlyBraceGroup in curlyBracesGroups)
{
curlyBraceGroupStr += curlyBraceGroup + " ";
}
return String.Format(curlyBraceGroupStr,bracketsGroups.Cast<Match>().Select(m=>m.Value).ToArray());
}
private MatchCollection GetMatchedCollections(string stringToSearch, string pattern)
{
var regex = new Regex(pattern, RegexOptions.IgnoreCase);
return regex.Matches(stringToSearch);
}
谢谢
在C#中使用Regex;您可以使用Regex.Matches和以下正则表达式提取参数。
((.*?))
然后,您可以使用Regex.Replace和此Regex来确定要替换的内容
{[0-9]+}
以及第一个正则表达式的结果匹配(按匹配顺序保持(,以替换这些占位符
您可以在这个正则表达式检查器中检查正则表达式
如果您不知道正则表达式,您可以在这里查看正则表达式。
注意:这将不适用于要替换{no}的文本中包含"("或"("的字符串。