[英]C# - Auto-detect Escape and Argument curly braces in string.Format
從這個 C# 示例開始:
string myStringFormat = "I want to surround string {0} with {{ and }}";
string myStringArgs = "StringToSurround";
string myFinalString = string.Format(myStringFormat, myStringArgs);
我想知道是否有一種快速簡單的方法來區分轉義字符/序列和花括號/方括號的參數。
我問這個的原因是:
+] 我想提供一些日志功能,我不想要求用戶注意雙花括號/方括號轉義規則
+] 我想非常快地根據性能要求進行這種區分
目前我能想到的唯一解決方案是掃描字符串以查找花括號/括號並對后續字符進行一些檢查(數字解析)。 正則表達式可能會有所幫助,但我找不到在這種情況下使用它們的方法。
順便說一句,我想要實現的最終情況是允許用戶這樣做而不會出現異常:
string myStringFormat = "I want to surround string {0} with { and }";
string myStringArgs = "StringToSurround";
//string myFinalString = string.Format(myStringFormat, myStringArgs); throwing exception
string myFinalString = MyCustomizedStringFormat(myStringFormat, myStringArgs);
編輯:
抱歉,“環繞”這個詞很棘手且具有誤導性,請考慮以下示例:
string myStringFormat = "I want to append to string {0} these characters {{ and }}";
string myStringArgs = "StringToAppendTo";
string myFinalString = string.Format(myStringFormat, myStringArgs);
給出輸出
我想附加到字符串 StringToAppendTo 這些字符 { 和 }
使用此正則表達式查找 Argument 子字符串:
{\\d+}
此正則表達式轉義{}
{1a}
等,僅選擇{1}
{11}
等。
現在您需要處理參數(用它們的值替換它們)或轉義的花括號(用雙括號替換它們)。 選擇權在您,取決於每個案例的出現次數。 (我選擇替換下面代碼中的參數)
現在您需要實際替換字符。 同樣,您可以選擇是否使用StringBuilder
。 這取決於輸入的大小和替換的數量。 無論如何,我建議StringBuilder
。
var m = Regex.Matches(input, @"{\d+}");
if (m.Any())
{
// before any arg
var sb = new StringBuilder(input.Substring(0, m[0].Index));
for (int i = 0; i < m.Count; i++)
{
// arg itself
sb.Append(args[i]);
// from right after arg
int start = m[i].Index + m[i].Value.Length;
if (i < m.Count - 1)
{
// until next arg
int length = m[i + 1].Index - start;
sb.Append(input.Substring(start, length));
}
else
// until end of input
sb.Append(input.Substring(start));
}
}
我相信這是最健壯和最干凈的方法,它沒有任何性能(內存或速度)問題。
編輯
如果您無權訪問args[]
那么您可以先用{{
/ }}
替換{
/ }
,然后簡單地對代碼進行以下修改:
@"{{\\d+}}"
m[i].Value.Substring(1, m[i].Value.Length - 2)
而不是args[i]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.