如何从字符串中删除加速器字符?

时间:2010-09-13 13:02:36

标签: .net wpf winforms string accelerator

我有GUI控件的标题,我想将其转换为简单的文本字符串。具体来说,我想删除加速器元字符。

例如(示例假设WinForms):

  • 剥离单次出现的元字符:&Yes变为Yes
  • 将双重匹配转换为单个:Income && Expense变为Income & Expense

我的代码将知道它是处理Windows窗体语法(加速器元字符是&)还是WPF(它是_)。但是,这是在后端代码中,所以我不想依赖任何WinForms或WPF库函数 - 我需要使用核心(非GUI)BCL程序集。 (在那一点上,我认为任何适用于WinForms的内容对于修改WPF来说都是微不足道的。)

我可以想到几种方法来做到这一点,但目前尚不清楚哪种方法最简单。

最简单的方法实现这个“删除元字符(如果单个,删除双倍,如果加倍”)?

更新:我曾假设WinForms和WPF都处理这些基本相同,但事实证明他们没有。 WinForms将在字符串末尾删除一个单独的元字符(Foo&变为Foo),但WPF不会(Foo_仍为Foo_)。奖励积分可以解决这两个问题。

1 个答案:

答案 0 :(得分: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标志并不理想。理想情况下,您使用枚举类型,或者可能有两个单独的方法。

我认为您不希望有一个能同时执行这两个操作的正则表达式。这是可能的,但是你最终会从WinForms字符串或WPF字符串的&符号中删除下划线。