5

データベースから読み取った文字列があります。これらの文字列は String.Format メソッドに入力されます。文字列に '{' '}' 中かっこが含まれているが、これらの中かっこが String.Format に対して正しくエスケープされていない場合 (つまり、別の '{' をそれらをエスケープします) String.Format は例外をスローします。

文字列にはこれらの中かっこの任意の組み合わせがあるため、本質的に、メソッドは文字列を調べて、'{' に終了文字があるかどうか、それらが一緒になって String.Format (つまり {5}) の有効なプレースホルダーを形成するかどうかを判断する必要があります。 、正しくエスケープする必要がないもの。

私はそれを行うためのメソッドを書くことができますが、.NET に組み込まれているものがあるのか​​ 、それともすでにこれを行っているものがあるのか​​ 疑問に思っていましたか?

文字列の例は次のとおりです。

{0} さん、こんにちは。詳細については、ユーザー マニュアルを参照してください {または、XXXX までお問い合わせください}"

おわかりのように、これを String.Format に入力すると、{または XXXX までお問い合わせください} で例外がスローされます。

4

3 に答える 3

2

これはどう:

string input = "Hello {0}, please refer for more information {or contact us at: XXXX}";
   Regex rgx = new Regex("(\\{(?!\\d+})[^}]+})");
string replacement = "{$1}";
string result = rgx.Replace(input, replacement);

Console.WriteLine("String {0}", result);

// Hello {0}, please refer for more information {{or contact us at: XXXX}}

...エスケープしてはならない唯一の文字列が format であると仮定します{\d+}

ここで 2 つの注意事項があります。まず、既にエスケープされた曲線の波括弧 - に遭遇するかもしれません{{。それを修正するのは、それほど簡単ではありません。さらにルックアラウンドを追加してください...

Regex rgx = new Regex("(\\{(?!\\d+})(?!\\{)(?<!\\{\\{)[^}]+})");

...つまり、ブラケットを交換しようとするときは、それが孤独なものであることを確認してください。)

第二に、フォーマット自体はそれほど単純ではないかもしれません.文字列に実際に存在する可能性のあるものの複雑さが増すにつれて、正規表現の複雑さも増します. たとえば、この小さな野獣は、数字で始まり}、その間にスペースを入れずに記号まで続くフォーマット文字列を修正しようとはしません。

Regex rgx = new Regex("(\\{(?!\\d\\S*})(?!\\{)(?<!\\{\\{)[^}]+})");

余談ですが、私は実際には 2 つの問題を抱えているのが好きな人間の 1 人ですが、これを見るとゾッとします。

更新:あなたが言ったように、{andの出現ごとにエスケープする必要がある場合}、タスクは実際には少し簡単ですが、ここでは2つのパスが必要になると思います:

Regex firstPass = new Regex("(\\{(?!\\d+[^} ]*}))");
string firstPassEscape = "{$1";
...
Regex secondPass        = new Regex("((?<!\\{\\d+[^} ]*)})");
string secondPassEscape = "$1}";
于 2012-10-01T22:55:01.103 に答える
0

試す:

myString = Regex.Replace(myString, @"\{(\D+)\}", "{{$1}}");
于 2012-10-01T23:03:52.343 に答える
0

カスタム処理ツールに別のエスケープ文字を使用することはできますか? あなたはすでに取られているものを選んだからです!

それが不可能な場合は、保存時にエスケープすることもできます。string.Format が終了すると、自動的にエスケープ解除されます。

var s = string.Format("Hello {0} please ... {{or contact}}", customer.Name );
// Now use s as needed 
// now is: "Hello Joe please ... {or contact}"
于 2012-10-01T22:46:15.713 に答える