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
相关产品推荐
相关产品推荐

