2010-09-13 72 views
3

我有一個GUI控件的標題,我想將它轉換爲一個簡單的文本字符串。具體來說,我想刪除加速器元字符。如何從字符串中刪除加速字符?

例如(實施例假設的WinForms):

  • 剝去元字符的單次出現:&Yes變得Yes
  • 轉換雙出現單:Income && Expense變得Income & Expense

我的代碼將知道它是否處理Windows窗體語法(其中加速器元字符是&)或WPF(它是_)。但是,這是後端代碼,所以我不想依賴任何WinForms或WPF庫函數 - 我需要使用核心(非GUI)BCL程序集來執行此操作。 (在這一點上,我認爲任何適用於WinForms的東西對於WPF都是微不足道的。)

我可以想到幾種方法來做到這一點,但不清楚哪一種最簡單。

什麼是最簡單的方法來實現這個「刪除元字符如果單一,如果加倍去除雙倍」?

更新:我假設WinForms和WPF都處理這些基本相同,但事實證明他們沒有。 WinForms將刪除字符串末尾的單獨元字符(Foo&變爲Foo),但WPF不會(Foo_仍爲Foo_)。獎勵積分爲解決這兩個問題的答案。

回答

4

我已編輯(刪除)我以前的答案。我認爲,最簡單的方法應該是這樣的正則表達式:

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

正確處理重複&號以及其中符號是最後一個字符的情況。

EDIT,基於附加提供的信息:

所以WinForms的表達將是"&(.?)",和WPF表達將是"_(.)"。你要求解決這兩種情況的解決方案,但我不確定你在問什麼。你原來的問題是,代碼知道它是處理WPF格式還是WinForms格式。所以我設想的方法:

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

而且,是的,我認識到,在界面使用Boolean標誌不太理想。理想情況下,你會使用枚舉類型,或者可能有兩個單獨的方法。

我不認爲你想要一個單一的正則表達式,將執行兩個。這是可能的,但是你最終會從WinForms字符串中刪除下劃線,或者從WPF字符串中刪除&符號。

+0

查看更新。這是不正確的寫作(WinForms會剝去一個尾部'&'),但如果您(1)將每個'&'更改爲'_'(在這種情況下它匹配WPF行爲),則會變得正確。或(2)將'「&(。)」'改爲'「&(。?)」(在這種情況下,它與WinForms行爲相匹配)。 – 2010-09-14 04:14:23

+0

是的,考慮到行爲上的差異,它可能是兩種不同的方法中最好的。但它看起來像這個釘子非常有效。 – 2010-09-15 00:32:46