3

GUIコントロールのキャプションがあり、それを単純なテキスト文字列に変換したいと思います。具体的には、アクセラレータのメタ文字を削除したいと思います。

例(例ではWinFormsを想定しています):

  • メタ文字の単一の出現を取り除きます:&YesになりますYes
  • ダブルオカレンスをシングルに変換:Income && ExpenseになりますIncome & Expense

私のコードは、Windowsフォーム構文(アクセラレータのメタ文字がどこにあるか)を扱っているのか、&WPF(それがどこにあるのか)を扱っているのかを認識します_。ただし、これはバックエンドコードに含まれているため、WinFormsまたはWPFライブラリ関数に依存したくありません。コア(非GUI)BCLアセンブリを使用してこれを行う必要があります。(そしてその時点で、WinFormsで機能するものはすべて、WPF用に変更するのは簡単だと思います。)

これを行うにはいくつかの方法が考えられますが、どれが最も簡単かは明確ではありません。

この「シングルの場合はメタ文字を削除し、ダブルの場合はデダブル」を実装する最も簡単な方法は何ですか?

更新: WinFormsとWPFはどちらも基本的に同じように処理されると思っていましたが、そうではないことがわかりました。WinFormsは、文字列の最後にある1つのメタ文字を削除します(Foo&になりますFoo)が、WPFは削除しません(Foo_残りますFoo_)。両方に対応する回答のボーナスポイント。

4

1 に答える 1

4

以前の回答を編集(削除)しました。最も簡単な方法は、この正規表現だと思います。

string input = "s&trings && stuf&f &";
input = Regex.Replace(input, "&(.)", "$1");

これは、繰り返されるアンパサンドと、アンパサンドが最後の文字である場合を正しく処理します。

追加の提供情報に基づいて編集:

したがって、WinForms式は"&(.?)"、になり、WPF式はになります"_(.)"。あなたは両方のケースに対処する解決策を求めていますが、あなたが何を求めているのかわかりません。元の質問によると、コードはWPF形式とWinForms形式のどちらを処理しているかを認識しています。だから私は方法を想像します:

string StripAccelerators(string s, bool isWinForms)
{
    string pat = (isWinForms) ? "&(.?)" : "_(.)";
    return Regex.Replace(s, pat, "$1");
}

そして、はい、Booleanインターフェイスでフラグを使用することは理想的とは言えません。理想的には、列挙型を使用するか、2つの別々のメソッドを使用することをお勧めします。

両方を実行する単一の正規表現は必要ないと思います。可能ですが、WinForms文字列からアンダースコアを削除したり、WPF文字列からアンパサンドを削除したりすることになります。

于 2010-09-13T15:47:38.900 に答える