如何替换字符串中的花括号及其内容
本文关键字:何替换 替换 字符串 | 更新日期: 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}"在你的文章中,我看到了两个解决方案:
-
使用简单的
Regex
:public static string InsertContent(string sentence, string value) { Regex rgx = new Regex(@"'{[^'}]*'}"); return rgx.Replace(sentence, value); }
注意,函数返回一个新的字符串对象。
-
如果您想用给定值替换括号之间的任何内容,或者只是无法控制括号之间的字符串,您也可以使用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