C#中是否存在标点与空白字符的.NET静态可引用列表?
问题
我需要按C#认定的标点和空白字符拆分字符串,目前没有使用复杂正则,而是通过char.IsPunctuation和char.IsWhiteSpace方法从输入字符串中提取标点/空白字符,生成去重后的字符数组用于拆分。想请教:.NET代码中是否存在C#认定的标点和空白字符的静态列表,可直接引用以替代每次从输入字符串生成的操作?
回答
.NET框架并没有直接暴露char.IsPunctuation和char.IsWhiteSpace所判定的全部字符的静态集合。原因在于这两个方法是基于Unicode标准实现的,.NET会随版本更新适配不同的Unicode版本,对应的字符范围是动态变化的,不会硬编码一个固定的静态列表。
如果需要替代每次从输入字符串提取的操作,可以参考以下两种方案:
- 自定义常用字符集合:如果你的业务场景只需要覆盖常见的标点和空白字符(比如空格、逗号、句号、制表符等),可以直接定义一个静态只读数组,这样性能最优,示例如下:
public static class CommonSeparators { public static readonly char[] PunctuationAndWhiteSpace = { ' ', '\t', '\n', '\r', ',', '.', '!', '?', ';', ':' }; } - 预生成全量符合条件的字符集合:如果必须严格匹配
char.IsPunctuation和char.IsWhiteSpace的所有字符,可以在程序启动时一次性生成并缓存这个集合,后续复用即可。示例代码如下:
之后拆分字符串时,直接使用这个预生成的集合作为分隔符来源即可,无需每次从输入字符串提取去重。public static class UnicodeCharSets { public static readonly HashSet<char> PunctuationAndWhiteSpace = new HashSet<char>(); static UnicodeCharSets() { // 遍历所有Unicode字符,筛选符合条件的项 for (char c = char.MinValue; c <= char.MaxValue; c++) { if (char.IsPunctuation(c) || char.IsWhiteSpace(c)) { PunctuationAndWhiteSpace.Add(c); } } } }
内容的提问来源于stack exchange,提问作者CarenRose
相关产品推荐
相关产品推荐

