String.Format 派生自字符串“{0}(所需长度为 20)”

String.Format derived from string "{0} (Length required 20)"

我从网络 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");

来自这些字符串

在 C# 中使用正则表达式; 您可以使用 Regex.Matches 和以下正则表达式提取参数。

(\(.*?\))

然后您可以使用 Regex.Replace 和此正则表达式来确定要替换的内容

\{[0-9]+\}

第一个正则表达式的结果匹配(按匹配顺序保存)替换这些占位符

你可以在这个regex checker
中检查你的正则表达式 如果您不了解正则表达式,可以在这里查看 regular expressions.

注意:这不适用于文本中包含“(”或“)”的字符串以替换{no.}。

这应该对您有所帮助。首先,您需要使用此方法从字符串中提取 collections:

    public static MatchCollection GetMatchedCollections(string stringToSearch, string pattern)
    {
       var regex = new Regex(pattern, RegexOptions.IgnoreCase);
       return regex.Matches(stringToSearch);
    }

那么你需要两个正则表达式:

  1. ({[0-9]+})+
  2. (([a-zA-Z].*?))

所以对于字符串 {0} {1} (Length required 20)(Mandatory) 上面的每一个都会 如下分别提取成collections:

  1. {0} {1}
  2. (长度要求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;

这将导致:

  1. curlyBraceGroupStr -----> {0} {1}
  2. bracketGroup1 ----->(长度要求 20)
  3. bracketGroup2 ----->(强制)

P.S:您还需要编写一个方法,可以根据参数的数量调用 String.Format("{0} {1}","Length required 20","Mandatory");。请注意 String.Format 接受类型 params obj[] 的参数。创建可以正确调用 string.Format 的方法应该很容易。但是,如果您有任何问题,请 post 提出一个单独的问题,因为它确实需要自己的标题。类似于 this question.

编辑:以下是op

的评论

我最终根据您的解决方案使用了这段代码:

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

谢谢