在C#开发中,文本内容的校验是常见需求,其中判断输入内容是否为汉字、匹配字符串中的中文片段是很多场景下的必要功能,比如用户昵称校验、中文内容提取、敏感词过滤等。使用正则表达式可以简洁高效地实现这类需求,核心是利用汉字对应的Unicode编码范围来编写匹配规则。

C#中汉字的Unicode编码范围
汉字在Unicode编码中的范围是u4e00到u9fff,这个范围覆盖了绝大多数常用汉字和扩展汉字。因此在编写正则表达式时,只需要匹配这个区间内的字符,就可以实现对汉字的识别。
基础正则匹配规则
对应的正则表达式为[u4e00-u9fff],其中方括号表示字符集合,u4e00和u9fff分别是汉字编码的起始和结束值,连字符表示范围。如果需要匹配多个连续汉字,可以在后面添加量词,比如[u4e00-u9fff]+表示匹配一个或多个连续汉字。
常见场景实现示例
1. 判断单个字符是否为汉字
可以通过正则匹配单个字符是否在汉字编码范围内,实现单个字符的汉字判断。
using System;
using System.Text.RegularExpressions;
class Program
{
static void Main()
{
char testChar1 = '中';
char testChar2 = 'a';
// 正则匹配单个汉字
string pattern = @"^[u4e00-u9fff]$";
bool isChinese1 = Regex.IsMatch(testChar1.ToString(), pattern);
bool isChinese2 = Regex.IsMatch(testChar2.ToString(), pattern);
Console.WriteLine($"字符 {testChar1} 是否为汉字:{isChinese1}");
Console.WriteLine($"字符 {testChar2} 是否为汉字:{isChinese2}");
}
}
2. 判断整个字符串是否全部为汉字
如果需要校验用户输入的字符串是否全部由汉字组成,只需要调整正则的量词和匹配规则,确保整个字符串都符合汉字范围。
using System;
using System.Text.RegularExpressions;
class Program
{
static void Main()
{
string str1 = "中文测试";
string str2 = "中文123";
// 匹配整个字符串都是汉字,^表示开头,$表示结尾
string pattern = @"^[u4e00-u9fff]+$";
bool allChinese1 = Regex.IsMatch(str1, pattern);
bool allChinese2 = Regex.IsMatch(str2, pattern);
Console.WriteLine($"字符串 {str1} 是否全部为汉字:{allChinese1}");
Console.WriteLine($"字符串 {str2} 是否全部为汉字:{allChinese2}");
}
}
3. 判断字符串是否包含汉字
很多场景下只需要判断字符串中是否存在至少一个汉字,不需要整个字符串都是汉字,此时可以去掉正则中的开头和结尾限定符。
using System;
using System.Text.RegularExpressions;
class Program
{
static void Main()
{
string str1 = "hello世界";
string str2 = "hello world";
// 匹配是否包含至少一个汉字
string pattern = @"[u4e00-u9fff]";
bool hasChinese1 = Regex.IsMatch(str1, pattern);
bool hasChinese2 = Regex.IsMatch(str2, pattern);
Console.WriteLine($"字符串 {str1} 是否包含汉字:{hasChinese1}");
Console.WriteLine($"字符串 {str2} 是否包含汉字:{hasChinese2}");
}
}
4. 提取字符串中的所有汉字
如果需要从混合字符串中提取所有的中文内容,可以使用Regex.Matches方法获取所有匹配的汉字,再拼接成结果字符串。
using System;
using System.Text.RegularExpressions;
using System.Text;
class Program
{
static void Main()
{
string mixedStr = "abc中文123测试def汉字";
string pattern = @"[u4e00-u9fff]";
// 获取所有匹配的汉字
MatchCollection matches = Regex.Matches(mixedStr, pattern);
StringBuilder chineseBuilder = new StringBuilder();
foreach (Match match in matches)
{
chineseBuilder.Append(match.Value);
}
string allChinese = chineseBuilder.ToString();
Console.WriteLine($"提取到的所有汉字:{allChinese}");
}
}
注意事项
- 正则中的Unicode编码需要以
u开头,后面跟4位十六进制数,注意是小写u,大写U在C#正则中不被识别。 - 如果字符串中包含中文标点符号,上述正则不会匹配,因为中文标点的Unicode范围不在
u4e00-u9fff内,如果需要同时匹配中文标点,需要额外添加对应的编码范围。 - 使用
Regex.IsMatch方法时,如果频繁使用同一个正则规则,建议将正则对象缓存起来,避免重复编译带来的性能损耗。