Как найти английские буквы в тексте?
Не давно мне попалась задача, в которой требовалось найти английские буквы в переданном в метод фрагменте текста. Задача довольно простая и есть несколько способов её решения, некоторые из которых я хочу показать в этой статье.
И так, предположим, что нам дана строка, которая содержит следующий текст:
string str = "Я drink 526 coffee в машине";
В качестве задачи нам нужно найти все английские буквы в данной строке и поместить их, к примеру, в какой-нибудь массив или список.
Переходим к решению. Как Вы, наверное, знаете, в языке c# любая строка представляет собой набор символов, это значит что приведенную строку, мы можем представить себе следующим образом:
char [] str = {'Я','','d','r','i','n','k', ... };
Чтобы найти английские буквы нам нужно создать массив, который содержит все буквы английского алфавита, и сравнить каждый символ данной нам строки с каждым элементом созданного массива, например это можно сделать следующим образом:
string str = "Я drink 526 coffee в машине"; //все английские буквы List<char> engLellers = new List<char> {'a','b','c','d', ...}; //список найденных букв List<char> foundLellers = new List<char>(); foreach(char ch in str.ToLowerInvariant()) { if (Char.IsLetter(ch) & engLellers.Contains(ch)) { foundLellers.Add(ch); } }
результат
С помощью метода IsLetter мы определяем, является ли текущий символ буквой, если нет, то пропускаем его.
Сразу же скажу, что необязательно использовать цикл, можно сократить количество кода, например, воспользовавшись, лямбда выражением:
foundLellers = str.ToLowerInvariant().Where(x => Char.IsLetter(x) & engLellers.Contains(x)).ToList();
Получаем тот же самый результат.
В принципе задача решена, но самый, наверное, большой минус в таком решении, заключается в том, что нам, чтобы найти английские буквы, приходиться создавать дополнительный массив и вручную заполнять его латинскими буквами. Было бы не плохо обойтись без этого действия, но как это сделать?
Решение на самом деле очень простое. В одной из предыдущих статей, я рассказывал, как можно быстро получить все буквы русского и английского алфавита. Этот же способ мы можем использовать и при решении данной задачи, например:
foundLellers = str.ToLowerInvariant().Where(x => Char.IsLetter(x) & (int)x >= 97 & (int)x 122).ToList();
Результат будет тот же самый.
На этом всё, если вопросы по теме, то оставляйте их в комментариях.
Читайте также: