Как я могу удалить определенный список символов из строки?
Например, у меня есть строка Multilanguage File07, и я хочу удалить все гласные, пробелы и числа, чтобы получить строку MltlnggFl.
Есть ли способ короче, чем использование петли foreach?
string MyLongString = "Multilanguage File07";
string MyShortString = MyLongString;
char[] charlist = new char[17]
{ 'a', 'e', 'i', 'o', 'u',
'0', '1', '2', '3', '4', '5',
'6', '7', '8', '9', '0', ' ' };
foreach (char letter in charlist)
{
MyShortString = MyShortString.Replace(letter.ToString(), "");
}
Мне не нравится а) способ написания такого количества апострофов (') и б) необходимость подсчета количества символов (в этом случае [17]) для определения списка символов.





Используйте этот код для замены списка символов в строке:
using System.Text.RegularExpressions;
string MyLongString = "Multilanguage File07";
string MyShortString = Regex.Replace(MyLongString, "[aeiou0-9 ]", "");
Результат:Multilanguage File07 => MltlnggFlText from which some chars should be removed 12345 => Txtfrmwhchsmchrsshldbrmvd
Объяснение, как это работает:
Выражение Regex, которое я использую здесь, представляет собой список независимых символов, определенных скобками []
=> [aeiou0-9 ]
Regex.Replace () выполняет итерацию по всей строке и проверяет каждый символ, если он соответствует одному из символов в регулярном выражении.
Каждая совпадающая буква будет заменена пустой строкой ("").
Я добавил Пояснение, как это работает. Спасибо за подсказку :-)
Как насчет этого:
var charList = new HashSet<char>(“aeiou0123456789 “);
MyLongString = new string(MyLongString.Where(c => !charList.Contains(c)).ToArray());
проголосовать за использование HashSet и за удаление двойного оператора linq
Мне это не нравится, потому что это еще слишком много для написания (слишком много апострофов и запятых). Для каждого символа нужно набрать на клавиатуре не менее 4 букв ...
Отредактировал ответ.
Попробуйте этот шаблон: (?|([aeyuio0-9 ]+)). Замените его пустой строкой, и вы получите желаемый результат.
Я использовал сброс ветки (?|...), чтобы все символы были объединены в одну группу для упрощения манипуляции.
Спасибо за ссылку на regex101.com. Этот сайт действительно хорош! Но я до сих пор не понимаю, для чего нужен термин (?|...). Если я его не использую, я все равно получаю только 1 группу регулярных выражений.
@MichaelHutter Тебе не обязательно его использовать. Но когда вы воспользуетесь \1 взамен и поиграете с ним, вы поймете, как это работает. Но только для вашей задачи, сброс ветки (?|...) не требуется. Если мой ответ вам помог, вы должны принять его (зеленая галочка слева) и, при желании, проголосовать за.
public void removeVowels()
{
string str = "MultilanguAge File07";
var chr = str.Where(c => !"aeiouAEIOU0-9 ".Contains(c)).ToList();
Console.WriteLine(string.Join("", chr));
}
1-я строка: создает желаемую строковую переменную.
2-я строка: с использованием linq игнорирует гласные слова [заглавные буквы, строчные буквы, цифры 0-9 и пробел] и преобразует их в список.
3-я строка: объединяет список chr в одну строку с помощью функции string.join.
результат: MltlnggFl7
Примечание: removeVowels функция не только строчных букв, цифр от 1 до 9 и пустого места, но и удаления прописных слов из строки.
"короче", что именно вы имеете в виду? меньше кода?