Я отредактировал (удалил) мой предыдущий ответ.Я думаю, что самым простым способом было бы это регулярное выражение:
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.