Использование UnicodeCategory в C#

Сегодня я бы хотел рассказать о категориях Unicode-символов в C#. Наверняка все использовали такие функции как char.IsLower(c), char.IsDigit(c) и подобные. Это определённо лучший способ получить информацию о символе, но мы можем получить гораздо больше информации о Unicode символах, если воспользуемся функцией char.GetUnicodeCategory(c)

Функция GetUnicodeCategory возвращает значение перечисления UnicodeCategory. Данное перечисление имеет порядка 30 значений, подробно о каждом можно прочитать в MSDN

Наиболее интересными мне показались следующие:

  • CurrencySymbol — символ денежной единицы;
  • MathSymbol — математические символы, такие как «=» и «+»;
  • OpenPunctuation — открывающий символ для одного из парных знаков, таких как квадратные и круглые скобки;
  • ClosePunctuation — закрывающий символ, для одного из парных знаков;

Использовать эти и остальные категории можно для различных анализов текста. Если необходимо проверять символ на определённое условие, удобно использовать расширения.

public static class CharExtensions
{
    public static bool IsOpenPunctuation(this char c)
    {
        return char.GetUnicodeCategory(c) == UnicodeCategory.OpenPunctuation;
    }
    public static bool IsClosePunctuation(this char c)
    {
        return char.GetUnicodeCategory(c) == UnicodeCategory.ClosePunctuation;
    }
    public static bool IsMath(this char c)
    {
        return char.GetUnicodeCategory(c) == UnicodeCategory.MathSymbol;
    }
    public static bool IsCurrency(this char c)
    {
        return char.GetUnicodeCategory(c) == UnicodeCategory.CurrencySymbol;
    }
}

Данное расширение позволяет проверить символ на то, что он является открывающим символом, закрывающим символом, математическим символом, символом денежной единицы.

Если же мы делаем анализ теста и нам необходимо подсчитать количество символом различных группы, то тогда лучше всего на прямую работать с UnicodeCategory. Напишем программу, делающую небольшой анализ текста.

var text = "=Пример текста для анализа (1)((2)$ €€ +";
var openPunctuation = 0;
var closePunctuation = 0;
var math = 0;
var currency = 0;
for (int i = 0; i < text.Length; i++)
{
    switch (char.GetUnicodeCategory(text[i]))
    {
            case UnicodeCategory.OpenPunctuation:
            openPunctuation++; break;
            case UnicodeCategory.ClosePunctuation:
                closePunctuation++; break;
            case UnicodeCategory.MathSymbol:
                math++; break;
            case UnicodeCategory.CurrencySymbol:
                currency++; break;
    }
}
Console.WriteLine("Открывающих символов {0}", openPunctuation);
Console.WriteLine("Закрывающих символов {0}", closePunctuation);
if (openPunctuation != closePunctuation)
{
    Console.WriteLine("\tНарушена расстановка скобок");
}
Console.WriteLine("Математических символов {0}", math);
Console.WriteLine("Денежных символов {0}", currency);

Результат:

Приятного программирования.

Добавить комментарий