簡體   English   中英

C# - 自動檢測 string.Format 中的轉義和參數花括號

[英]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[]那么您可以先用{{ / }}替換{ / } ,然后簡單地對代碼進行以下修改:

  1. 使用這種模式: @"{{\\d+}}"
  2. m[i].Value.Substring(1, m[i].Value.Length - 2)而不是args[i]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM