Как я могу удалить символы ускорителя из строки? - PullRequest
3 голосов
/ 13 сентября 2010

У меня есть заголовок для элемента управления графическим интерфейсом, и я хочу преобразовать его в простую текстовую строку. В частности, я хочу удалить метасимволы ускорителя.

Например (примеры предполагают WinForms):

  • Удалите отдельные вхождения метасимвола: &Yes становится Yes
  • Конвертировать двойные вхождения в одиночные: Income && Expense становится Income & Expense

Мой код будет знать, имеет ли он дело с синтаксисом Windows Forms (где метасимвол акселератора &) или WPF (где он _). Тем не менее, это в фоновом коде, поэтому я не хочу брать зависимость от каких-либо функций библиотеки WinForms или WPF - мне нужно сделать это с помощью базовых (не GUI) сборок BCL. (И на этом этапе я полагаю, что все, что работает для WinForms, было бы тривиально изменить для WPF.)

Я могу придумать несколько способов сделать это, но не ясно, какой из них самый простой.

Каков самый простой способ реализовать это «удалить метасимволы, если одинарные, двойные, если удвоенные»?

Обновление: Я предполагал, что WinForms и WPF обрабатывали их в основном одинаково, но оказывается, что они этого не делают. WinForms удалит одиночный метасимвол в конце строки (Foo& становится Foo), но WPF не будет (Foo_ остается Foo_). Бонусные баллы за ответ, который касается обоих.

1 Ответ

4 голосов
/ 13 сентября 2010

Я отредактировал (удалил) мой предыдущий ответ.Я думаю, что самым простым способом было бы это регулярное выражение:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...