如何在C# Visual Studio中实现文本内姓名/全名出现次数的统计功能
姓名全匹配统计解决方案
问题原因
现有代码的逻辑是仅将连续字母序列作为比对单元,遇到空格、标点等非字母字符就会清空当前缓存的字符串,因此永远无法生成包含空格的全名匹配串,自然无法统计带空格的全名出现次数。
修复方案
使用正则表达式实现精准全匹配,修复后代码如下:
using System; using System.IO; using System.Text.RegularExpressions; namespace Harry { class Program { static void Main(string[] args) { string input = Console.ReadLine()?.Trim() ?? string.Empty; if (string.IsNullOrEmpty(input)) { Console.WriteLine("输入不能为空"); return; } string text = File.ReadAllText("Harry Potter and the Sorcerer.txt"); // 转义输入中的正则特殊字符,避免输入含特殊符号时匹配异常 string escapedInput = Regex.Escape(input); // 匹配规则:姓名前后为非单词字符或文本首尾,避免部分匹配误判 string pattern = $@"(?<!\w){escapedInput}(?!\w)"; // 忽略大小写匹配,需要严格区分大小写可删除RegexOptions.IgnoreCase参数 int count = Regex.Matches(text, pattern, RegexOptions.IgnoreCase).Count; Console.WriteLine($"{input}: {count} occurrences"); } } }
代码说明
- 用
File.ReadAllText简化了文本读取逻辑,等价于原有StreamReader读取全量文本的操作 Regex.Escape会自动转义输入中的正则特殊字符,避免输入包含.、*等符号时出现匹配异常- 前后的断言
(?<!\w)和(?!\w)确保匹配内容的前后不是单词字符,避免把Harry Potterson这类内容误统计为Harry Potter的匹配项
内容的提问来源于stack exchange,提问作者Mical -
相关产品推荐
相关产品推荐

