Страницы

Поиск по вопросам

вторник, 24 декабря 2019 г.

Проверить принадлежность текста культуре

#c_sharp


Есть в C# готовые методы проверки по типу

var culture = new CultureInfo("ru");
var text = "hello world";
var isRu = text.Of(culture); //false

    


Ответы

Ответ 1



Если ваша задача проверить принадлежность символов строки к определенному алфавиту (без учета валидности слов в каком-то языке), то давайте напишем такой простой класс с методами-расширения: public static class CultureHelper { static readonly string whitespaceChars = @" .,-()!?"; static readonly string cyrillicChars = "абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"; public static bool IsCyrillicText(this string s) { return s.All(c => cyrillicChars.Contains(c) || whitespaceChars.Contains(c)); } } Изпользование: Console.WriteLine("Привет, мир!".IsCyrillicText()); Console.WriteLine("Hello, world!".IsCyrillicText()); Console.WriteLine("Привет, John!".IsCyrillicText()); Вывод: True False False

Ответ 2



В платформе .NET очень мощные регулярные выражения. Для поставленной задачи можно применить общие категории Юникода и именованные блоки. Сдалем метод расширения, как в ответе Андрея. Только вместо вручную заданных диапазонов символов возьмём готовые. public static class CultureHelper { public static bool IsCyrillicText(this string s) { return s.Where(c => Regex.IsMatch(c.ToString(), @"\p{L}")) .All(c => Regex.IsMatch(c.ToString(), @"\p{IsCyrillic}")); } } Console.WriteLine("Привет, мир!".IsCyrillicText()); // True Console.WriteLine("Hello, world!".IsCyrillicText()); // False Console.WriteLine("Привет, John!".IsCyrillicText()); // False Метод сперва отфильтровывает из текста только буквы, потом проверяет их на принаделжность к нужной группе. Это гарантирует корректную работу с любыми символами Юникода.

Комментариев нет:

Отправить комментарий