我有GUI控件的标题,我想将其转换为简单的文本字符串。具体来说,我想删除加速器元字符。
例如(示例假设WinForms):
&Yes
变为Yes
Income && Expense
变为Income & Expense
我的代码将知道它是处理Windows窗体语法(加速器元字符是&
)还是WPF(它是_
)。但是,这是在后端代码中,所以我不想依赖任何WinForms或WPF库函数 - 我需要使用核心(非GUI)BCL程序集。 (在那一点上,我认为任何适用于WinForms的内容对于修改WPF来说都是微不足道的。)
我可以想到几种方法来做到这一点,但目前尚不清楚哪种方法最简单。
最简单的方法实现这个“删除元字符(如果单个,删除双倍,如果加倍”)?
更新:我曾假设WinForms和WPF都处理这些基本相同,但事实证明他们没有。 WinForms将在字符串末尾删除一个单独的元字符(Foo&
变为Foo
),但WPF不会(Foo_
仍为Foo_
)。奖励积分可以解决这两个问题。
答案 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字符串的&符号中删除下划线。