如何替换字符串中的花括号及其内容

本文关键字:何替换 替换 字符串 | 更新日期: 2023-09-27 18:11:31

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

相关代码示例:
string value = "6";
string sentence = "What is 3 x {contents}";
# insert some sort of method sentence.replace(value,"{contents}");

用value替换"{contents}"的最佳方法是什么?给定花括号内的名称可能会改变,但无论名称是什么,它都将包含在花括号内。

我看了一下regex,要么我失去了概念,要么我找不到相关的语法来完成我想做的事情。这是实现这一目标的最佳方式吗?如果是,又是如何做到的?如果不是,有什么更好的方法来实现这一点?

如何替换字符串中的花括号及其内容

使用Regex.Replace:

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

MSDN是理解regex的一个很好的起点

我通常会这样做:

        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;
        }
<代码>

如果我正确理解了你想要做的事情,并且假设你想要替换"{contents}"在你的文章中,我看到了两个解决方案:

  1. 使用简单的Regex:

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

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

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

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

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

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

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

您可以使用以下代码:

PP_8