【问题标题】:How to replace curly braces and its contents in a string如何替换字符串中的花括号及其内容
【发布时间】:2016-10-04 14:04:41
【问题描述】:

我遇到了一个问题,试图用一个外部值替换用花括号描述的字符串的某些内容。

相关代码示例:

string value = "6";
string sentence = "What is 3 x {contents}";
# insert some sort of method sentence.replace(value,"{contents}");

用值替换“{contents}”的最佳方法是什么,因为花括号内的名称可能会改变,但无论名称如何,它都会包含在花括号内。

我对 regex 进行了一些研究,要么是我迷失了这些概念,要么是我找不到相关的语法来完成我想做的事情。这是实现这一目标的最佳方法,如果是这样,如何实现?如果不是,有什么更好的方法来实现这一点?

【问题讨论】:

标签: c# regex replace


【解决方案1】:

使用Regex.Replace:

string value = "6";
string sentence = "What is 3 x {contents}";
var result = Regex.Replace(sentence, "{.*?}", value); // What is 3 X 6

MSDN 是了解正则表达式的好起点

【讨论】:

  • 谢谢,在这种情况下 .* 到底在做什么?我知道这与添加内容有关,但每个项目分别完成了什么
  • @Zannith:现在是阅读正则表达式入门的好时机,而不是单独询问每个小部分。
  • 正则表达式错误,尝试用它替换“Example {text1} more text {text2}”。
  • @Jon Skeet:是的,我之前查找了有关它的信息,但我发现对于像我这样的初学者来说,我发现了一些非常令人困惑的东西。您对我学习的好地方有什么想法吗?
  • @Zannith - 添加了一些解释的链接
【解决方案2】:

我通常会做这样的事情:

        public static string FormatNamed(this string format, params object[] args)
        {
            var matches = Regex.Matches(format, "{.*?}");

            if (matches == null || matches.Count < 1)
            {
                return format;
            }

            if (matches.Count != args.Length)
            {
                throw new FormatException($"The given {nameof(format)} does not match the number of {nameof(args)}.");
            }

            for (int i = 0; i < matches.Count; i++)
            {
                format = format.Replace(
                    matches[i].Value,
                    args[i].ToString()
                );
            }

            return format;
        }

【讨论】:

    【解决方案3】:

    如果我正确理解您想要做什么,并假设您想替换文本中“{contents}”的每个实例,我会看到两种解决方案:

    1. 使用简单的string.Replace(string, string):

      public static string InsertContent(string sentence, string placeholder, string value)
      {
          return sentence.Replace("{" + placeholder + "}", value);
      }
      

      请注意,该函数返回一个新的字符串对象。

    2. 如果您想用给定值替换括号之间的任何内容,或者只是无法控制括号之间的字符串是什么,您也可以使用Regex

      public static string InsertContent(string sentence, string value)
      {
          Regex rgx = new Regex(@"\{[^\}]*\}");
          return rgx.Replace(sentence, value);
      }
      

      同样,该函数返回一个新的字符串对象。

    【讨论】:

      【解决方案4】:

      这个答案就像@WizxX20 的一样,但是这个 V2 方法有更直观的行为和更有效的字符串替换逻辑,如果对一个大文本文件运行这个方法会变得很明显。自己判断:

      string someStr = "I think I had {numCows} cows, wait actually it was {numCows} when I heard that serendipitous news at {time}.";
      object[] args = new object[] { 3, 5, "13:45"};
      
      //I think I had 3 cows, wait actually it was 3 when I heard that serendipitous news at 13:45.
      Console.WriteLine(FormatNamed(someStr, args));
      
      //"I think I had 3 cows, wait actually it was 5 when I heard that serendipitous news at 13:45."
      Console.WriteLine(FormatNamedV2(someStr, args));
      
      
      
      static string FormatNamedV2(string format, params object[] args)
      {
          if(string.IsNullOrWhiteSpace(format))
              return format;
      
          var i = 0;  
          var sanitized = new Regex("{.*?}").Replace(format, m =>
          {
              //convert "NumTimes: {numTimes}, Date: {date}" to "NumTimes: {0}, Date: {1}" etc.
              var replacement = $"{{{i}}}";
              i++;
              return replacement;
          });
      
          if (i != args?.Length)
          {
              var formatPrettyPrint = format.Length > 16 ? $"{format.Substring(0, 16)}..." : format;
              throw new FormatException($"The given {nameof(format)} \"{formatPrettyPrint}\" does not match the number of {nameof(args)}: {args.Length}.");
          }
      
          return string.Format(sanitized, args);
      }
          
      

      【讨论】:

        【解决方案5】:

        您可以使用此代码:

        Regex.Replace(input, @"{[^{}]+}", "new string");
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-11-25
          • 2014-08-07
          • 2015-09-26
          • 2013-08-14
          • 2015-04-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多