5

ここで見たもの(受け入れられた回答)に基づいて、これを行うことで文字列をエスケープできるようです:

string s = "Woolworth's";
string t = Regex.Escape(s);
MessageBox.Show(t);

...しかし、それをステップスルーすると、s と t の間に違いは見られません (両方の変数の "Woolworth's" ではなく、t の値として "Woolworth\'s" が表示されることを望みました)。

私は、次のようなことができると思います:

    string s = "Woolworth's";
    s = s.Replace("'", "\'");

...etc., also escaping the following: [, ^, $, ., |, ?, *, +, (, ), and \

...しかし、「ワンストップショッピング」ソリューションが望ましいでしょう。

具体的には、ユーザーが入力する文字列が、Android の arrays.xml ファイルで文字列値として受け入れられるものである必要があります。

たとえば、これで窒息します:

<item>Woolworth's</item>

...これが必要です:

<item>Woolworth\'s</item>
4

4 に答える 4

3

Regex.Escapeこのコンテキストには適していません。

これは正規表現用に厳密に設計されており、このコンテキストではエスケープが多すぎたり少なすぎたりします。モデルに押し込もうとすると、他の値が壊れる可能性があります。'(または"、これらの文字が .NET 正規表現で特別な意味を持たないため、エスケープしません。)

ここで関連するのは、文字列リソース ファイルの Item 要素が、XML から読み取られた後にテキストの特別な解析 (書式設定に関連する)を行うことです。

文字列にアポストロフィまたは引用符がある場合は、それをエスケープするか、文字列全体を別の種類の引用符で囲む必要があります。

したがって、このコンテキストで適切な変換は単純です。

s.Replace("'", "\'").Replace("\"", "\\\"")

また

Regex.Replace(s, "['\"]", "\\$&")

(そして、XML が DOM または LINQ to XML を介して適切に構築されていると仮定すると、XML エンコーディングは別の場所で処理されます。ただし、書式設定と混合コンテンツのスタイリングを使用する場合、ルールはより複雑になります。)

于 2014-06-04T21:31:39.267 に答える