You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Haskell中如何实现判断字符是否为西里尔字母的优雅函数?

优雅检查字符是否为西里尔字母的方案

嘿,你的这个需求完全在点子上——只针对俄语做简单近似确实覆盖不了其他西里尔语系语言,硬编码字符范围更是不够优雅的实践。其实Unicode标准本身就给每个字符标注了对应的脚本属性,直接基于这个属性判断才是最优解,不用自己去维护那些繁琐的字符区间!

Unicode里所有西里尔字母都归属于Cyrillic脚本类别,主流编程语言几乎都提供了直接调用这个属性的API,下面给你几个常见语言的实现示例:

Python实现

你可以用regex库(注意不是标准库的re)的Unicode脚本匹配,或者用unicodedata模块获取字符名称判断:

方法一:使用regex库(推荐)

import regex

def is_cyrillic(char):
    # 匹配属于Cyrillic脚本的字符
    return regex.match(r'\p{Script=Cyrillic}', char) is not None

# 测试示例
print(is_cyrillic('А'))   # 输出True
print(is_cyrillic('Є'))   # 输出True(乌克兰语专属字符)
print(is_cyrillic('a'))   # 输出False

方法二:使用标准库unicodedata

import unicodedata

def is_cyrillic(char):
    try:
        # 字符名称的前缀通常是脚本类型,比如"CYRILLIC CAPITAL LETTER A"
        return unicodedata.name(char).split()[0] == 'CYRILLIC'
    except ValueError:
        # 处理无法识别的字符(比如控制字符、私用区域字符)
        return False

Java实现

Java标准库的Character类直接提供了获取Unicode脚本的方法:

public class CyrillicChecker {
    public static boolean isCyrillic(char c) {
        return Character.UnicodeScript.of(c) == Character.UnicodeScript.CYRILLIC;
    }

    public static void main(String[] args) {
        System.out.println(isCyrillic('А'));  // 输出true
        System.out.println(isCyrillic('Ў'));  // 输出true(白俄罗斯语字符)
        System.out.println(isCyrillic('b'));  // 输出false
    }
}

C#实现

在.NET 6及以上版本,可以用CharUnicodeInfo.GetScript直接判断;也可以用正则的Unicode脚本匹配:

方法一:.NET 6+原生API

using System.Globalization;

public static class CyrillicChecker
{
    public static bool IsCyrillic(char c)
    {
        return CharUnicodeInfo.GetScript(c) == UnicodeScript.Cyrillic;
    }

    public static void Main()
    {
        System.Console.WriteLine(IsCyrillic('А'));  // 输出True
        System.Console.WriteLine(IsCyrillic('Щ'));  // 输出True(俄语字符)
        System.Console.WriteLine(IsCyrillic('c'));  // 输出False
    }
}

方法二:正则匹配

using System.Text.RegularExpressions;

public static bool IsCyrillic(char c)
{
    return Regex.IsMatch(c.ToString(), @"\p{IsCyrillic}");
}

为什么推荐基于Unicode脚本的方案?

  • 覆盖全面:自动包含所有使用西里尔字母的语言(俄语、乌克兰语、保加利亚语、哈萨克语等),不会遗漏扩展字符
  • 维护成本低:Unicode标准更新时,语言标准库通常会同步跟进,不用手动更新字符范围
  • 代码更简洁:相比硬编码一大串字符区间,可读性和可维护性都高得多

内容的提问来源于stack exchange,提问作者Alexey Romanov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:10:48