5

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

var culture = new CultureInfo("ru");
var text = "hello world";
var isRu = text.Of(culture); //false
MihailPw
  • 6,384

2 Answers2

2

Если ваша задача проверить принадлежность символов строки к определенному алфавиту (без учета валидности слов в каком-то языке), то давайте напишем такой простой класс с методами-расширения:

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
  • Спасибо за пример реализации, но у меня нет проблем с написанием подобного. Просто время затратно искать все символы всех алфавитов – DenisJNewb May 22 '17 at 06:00
  • @DenisJNewb - я вот тоже помучался с поиском всех символов алфавитов (можете заценить ревизии моего ответа (фэйспалм)), в итоге нашёл нужную комбинацию категорий и блоков регулярок. – Alexander Petrov May 22 '17 at 13:42
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

Метод сперва отфильтровывает из текста только буквы, потом проверяет их на принаделжность к нужной группе. Это гарантирует корректную работу с любыми символами Юникода.