在C#程序开发过程中,判断字符串是否为全字词是一个比较常见的需求,比如在用户昵称校验、纯文本过滤、关键词匹配等场景中,都需要确认字符串里只包含字词类字符,不存在数字、标点符号、特殊符号等无关内容。下面介绍几种常用的实现方式。

什么是全字词字符
通常我们所说的全字词字符包含两类,一类是各国语言的字母,比如英文字母、法文字母等,另一类是表意文字,比如汉字、日文汉字等。数字、标点符号、空格、控制字符等都不属于全字词字符的范畴。在C#中可以通过字符的Unicode分类来判断字符是否属于这两类。
方法一:使用正则表达式判断
正则表达式是处理字符串匹配问题的高效工具,我们可以通过编写匹配全字词的正则表达式来实现检查功能。匹配字母的正则表达式是p{L},匹配表意文字的正则表达式是p{IsCJKUnifiedIdeographs},组合起来就可以匹配所有全字词字符。
实现代码如下:
using System;
using System.Text.RegularExpressions;
public class StringCheckHelper
{
// 正则表达式:匹配一个或多个全字词字符,^表示开头,$表示结尾
private static readonly Regex FullWordRegex = new Regex(@"^[p{L}p{IsCJKUnifiedIdeographs}]+$");
/// <summary>
/// 检查字符串是否为全字词
/// </summary>
/// <param name="input">待检查的字符串</param>
/// <returns>如果是全字词返回true,否则返回false</returns>
public static bool IsFullWordByRegex(string input)
{
// 先判断输入是否为空,空字符串不属于全字词
if (string.IsNullOrEmpty(input))
{
return false;
}
return FullWordRegex.IsMatch(input);
}
}
我们可以测试这个方法的运行效果:
class Program
{
static void Main()
{
string test1 = "你好世界";
string test2 = "HelloWorld";
string test3 = "你好123";
string test4 = "Hello World"; // 包含空格
string test5 = "测试!"; // 包含感叹号
Console.WriteLine($""{test1}" 是否为全字词:{StringCheckHelper.IsFullWordByRegex(test1)}");
Console.WriteLine($""{test2}" 是否为全字词:{StringCheckHelper.IsFullWordByRegex(test2)}");
Console.WriteLine($""{test3}" 是否为全字词:{StringCheckHelper.IsFullWordByRegex(test3)}");
Console.WriteLine($""{test4}" 是否为全字词:{StringCheckHelper.IsFullWordByRegex(test4)}");
Console.WriteLine($""{test5}" 是否为全字词:{StringCheckHelper.IsFullWordByRegex(test5)}");
}
}
运行后输出结果如下:
"你好世界" 是否为全字词:True "HelloWorld" 是否为全字词:True "你好123" 是否为全字词:False "Hello World" 是否为全字词:False "测试!" 是否为全字词:False
方法二:遍历字符逐个判断
如果不想使用正则表达式,也可以遍历字符串中的每个字符,逐个判断字符是否属于全字词类别。C#中的char.GetUnicodeCategory方法可以获取字符的Unicode分类,字母的分类是UnicodeCategory.UppercaseLetter、UnicodeCategory.LowercaseLetter、UnicodeCategory.TitlecaseLetter、UnicodeCategory.ModifierLetter、UnicodeCategory.OtherLetter,表意文字的分类是UnicodeCategory.OtherLetter但需要通过范围判断,或者使用CharUnicodeInfo.GetUnicodeCategory结合范围校验。
实现代码如下:
using System;
using System.Globalization;
public class StringCheckHelper
{
/// <summary>
/// 检查单个字符是否为全字词字符
/// </summary>
private static bool IsFullWordChar(char c)
{
// 获取字符的Unicode分类
UnicodeCategory category = CharUnicodeInfo.GetUnicodeCategory(c);
// 判断是否为字母类
bool isLetter = category == UnicodeCategory.UppercaseLetter ||
category == UnicodeCategory.LowercaseLetter ||
category == UnicodeCategory.TitlecaseLetter ||
category == UnicodeCategory.ModifierLetter ||
category == UnicodeCategory.OtherLetter;
// 判断是否为CJK统一表意文字范围(0x4E00到0x9FFF)
bool isCjkIdeograph = c >= 0x4E00 && c <= 0x9FFF;
return isLetter || isCjkIdeograph;
}
/// <summary>
/// 遍历字符检查字符串是否为全字词
/// </summary>
public static bool IsFullWordByTraverse(string input)
{
if (string.IsNullOrEmpty(input))
{
return false;
}
foreach (char c in input)
{
if (!IsFullWordChar(c))
{
return false;
}
}
return true;
}
}
两种方法的对比
我们可以通过下面的表格对比两种方法的优缺点:
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 正则表达式 | 代码简洁,匹配规则灵活,支持复杂的字符范围定义 | 正则解析有一定性能开销,复杂正则可读性较差 | 需要快速实现、规则可能频繁调整的场景 |
| 遍历字符判断 | 性能更可控,没有正则解析开销,逻辑清晰 | 代码量稍多,字符范围需要手动维护 | 对性能要求高、字符规则固定的场景 |
注意事项
- 空字符串和仅包含空格的字符串都不属于全字词,需要在方法开头做空值判断。
- 如果需要支持更多语言的表意文字,比如日文假名、韩文谚文,需要额外添加对应的Unicode范围判断或者正则规则。
- 如果字符串可能包含非常长的长度,遍历字符的方法可以避免正则回溯带来的性能问题。
根据实际业务需求选择合适的方法,就可以快速实现C#字符串全字词检查的功能。