c# - 计算“名称”和“姓氏”在 c# Visual Studio 中的文本中出现的次数
问题描述
我希望能够用 Visual Studio 在 C# 中计算姓名和姓氏。目前我只能在文本中搜索 1 个单词。我正在使用 .NET 5.0(当前)创建控制台应用程序。
(当输入为“Harry”时,它计算找到了多少次 Harry,当输入为“Harry Potter”时,即使文本中多次出现“Harry Potter”,它也始终计为 0。)
我一直在谷歌上寻找答案,但只能找到如何计算 1 个单词。
这是我当前的代码:
using System;
using System.IO;
namespace Harry
{
class Program
{
static void Main(string[] args)
{
string input = Console.ReadLine();
StreamReader stream = File.OpenText("Harry Potter and the Sorcerer.txt");
string text = stream.ReadToEnd();
string woord = "";
int count = 0;
foreach (var item in text)
{
if (Char.IsLetter(item))
{
woord = woord + item;
}
else
{
if(woord == input)
{
count++;
}
woord = "";
}
}
Console.Write(input + ": " + count + " occurrences");
}
}
}
解决方案
也许,符合 Auditive 的建议:
int count = System.Text.RegularExpressions.Regex.Matches(text, input, RegexOptions.IgnoreCase).Count
如果您仍然很矮,请更改输入,使其具有值harry\s+potter
,\s+
意思是“至少一个空格”,以防万一您的文本有harrySPACESPACEpotter
..(欢迎来到正则表达式的奇妙、神秘的世界)
如果您仍然很矮,我认为您的文档中可能存在拼写错误!
--
如果你想数哈利或波特,你可以将你的正则表达式调整为harry|potter
..
--
存在解决此挑战的其他方法,一种典型的方法是检查通过拆分获得的数组的长度:
int count = text.Split(input).Length - 1;
如果有 5 个 Harry Potters,您将从 Split 中得到一个 6 长的数组,因此是 -1。不过,它可能会占用更多资源;如果您追求尽可能低的 CPU 消耗,您可能会看到类似以下内容:
int count=0;
for(int idx = text.IndexOf(input); idx > -1; count++, idx = text.IndexOf(input, idx+input.Length));
这会设置一个用于计数的变量,然后重复使用 IndexOf 直到它返回 -1。每次第一次之后,IndexOf 都从上次找到的字符串的末尾开始。没有循环体,一切都发生在标题中。
值得指出的是,这些都不是不区分大小写的,但可以通过更多的工作来做到这一点
推荐阅读
- react-native - 使用 React Native 上 ScrollView 中的 onScroll 事件更新值
- android - 使用 QT Creator 创建映射错误时出错
- google-sheets - 如何将连续正数或负数的平均值放入一个单元格?
- time - 如何在 Big Query 中按分钟计算事件
- mongodb - 更改mongodb文本索引的权重
- google-chrome - Chrome 和 Adobe 通过脚本静默更新,无需从 sccm 部署 msi 文件
- c++ - 这是 Clang 的 C++20 概念实现中的错误吗?不必要的约束检查导致无限模板递归
- javascript - JavaScript 对象中的方法
- javascript - 如何在javascript中计算和仅在数组中添加重复值
- java - 无符号移位运算对于相同的移位次数产生不同的结果