C# 从文件中读取并计算文件中的单词
我正在浏览一系列项目想法,我的目标是把它们都做好,希望到时候我在C# 从文件中读取并计算文件中的单词,c#,regex,grammar,C#,Regex,Grammar,我正在浏览一系列项目想法,我的目标是把它们都做好,希望到时候我在c.方面会相当不错。我已经写了一个程序,可以计算给定文件中的字数,它可以工作,但是有一个bug 工作原理: 文件名作为提示给出,用户输入文件路径或名称 然后,该文件通过一个正则表达式:“[a-zA-Z]+”运行,该正则表达式将单词拆分为一个数组 然后计算数组的长度 我遇到的唯一问题是,如果使用,(撇号),它会将单词分成两个单词,例如,如果我从一个文件中读取到:,这是对我的程序的测试,现在我要再次测试它,要查看发生了什么…当它应该
c.
方面会相当不错。我已经写了一个程序,可以计算给定文件中的字数,它可以工作,但是有一个bug
工作原理:
- 文件名作为提示给出,用户输入文件路径或名称
- 然后,该文件通过一个正则表达式:
运行,该正则表达式将单词拆分为一个数组“[a-zA-Z]+”
- 然后计算数组的长度
,
(撇号),它会将单词分成两个单词,例如,如果我从一个文件中读取到:,这是对我的程序的测试,现在我要再次测试它,要查看发生了什么…
当它应该输出19
时,它将输出20
,因为它将I'm
拆分为两个单词。有没有一种方法可以让正则表达式补偿正确的语法使用,或者没有regex
资料来源:
using System;
using System.IO;
using Reg = System.Text.RegularExpressions.Regex;
namespace count
{
class CountWordsInString
{
static string Count(string list)
{
string[] arrStr = Reg.Split(list, "[a-zA-Z]+");
int length = arrStr.Length - 1;
return length.ToString();
}
static void Main(string[] args)
{
Console.Write("Enter file path: ");
var file = Console.ReadLine();
var info = File.ReadAllText(file);
Console.WriteLine(Count(info));
}
}
}
一种方法是匹配任何非空白的内容(空格、制表符等)。这可以通过如下所示的否定字符类来实现:
^
表示一个字符类,该字符类将匹配除其中字符以外的任何字符。当然,这假设您对“单词”的定义是一个在空格上拆分的字符串
试试看。一种方法是匹配任何非空白的内容(空格、制表符等)。这可以通过如下所示的否定字符类来实现:
^
表示一个字符类,该字符类将匹配除其中字符以外的任何字符。当然,这假设您对“单词”的定义是一个在空格上拆分的字符串
试试看。在我看来,如果你想计算单词,你不需要正则表达式。RegEx是一个很大的库,如果您不注意如何使用它,它会消耗大量资源 split函数是一个更好的选择,将文本加载到变量上,并以以下方式应用split方法:
string[]分隔符={“”,“\r\n”,“\n”};
string value=“将被计算字数的字符串”;
string[]words=value.Split(分隔符、StringSplitOptions.RemoveEmptyEntries);
Console.WriteLine(words.Count)代码>在我看来,如果你想计算单词,你不需要正则表达式。RegEx是一个很大的库,如果您不注意如何使用它,它会消耗大量资源
split函数是一个更好的选择,将文本加载到变量上,并以以下方式应用split方法:
string[]分隔符={“”,“\r\n”,“\n”};
string value=“将被计算字数的字符串”;
string[]words=value.Split(分隔符、StringSplitOptions.RemoveEmptyEntries);
Console.WriteLine(words.Count)代码>如果希望“单词”包含可选的撇号,可以使用正则表达式
[A-Za-z]+('[A-Za-z]+)*
这将匹配包含撇号的单词,只要撇号被字母包围。因此,它将匹配fo'c'le
(一个单词,根据Ubuntu字典),但不匹配a'b
或'Twas
。对于单词计数,首字母和最后一个撇号没有任何区别--'Twas
被视为一个单词,但是如果你想对单词做一些事情,比如拼写检查,那么你需要一种更复杂的方法来正确处理'Twas
,同时仍然从以下位置提取单词Go
:
"Start running when I say 'Go!'," he said.
如果希望“words”包含可选的撇号,可以使用正则表达式
[A-Za-z]+('[A-Za-z]+)*
这将匹配包含撇号的单词,只要撇号被字母包围。因此,它将匹配fo'c'le
(一个单词,根据Ubuntu字典),但不匹配a'b
或'Twas
。对于单词计数,首字母和最后一个撇号没有任何区别--'Twas
被视为一个单词,但是如果你想对单词做一些事情,比如拼写检查,那么你需要一种更复杂的方法来正确处理'Twas
,同时仍然从以下位置提取单词Go
:
"Start running when I say 'Go!'," he said.
检查..只匹配..不要拆分..考虑到单词只包含字母表而不包含字母表numerics@rock321987我想了想,但这更容易,因为我知道如何使用regexmatch
也是regex@rock321987我没有考虑使用match
有效点,谢谢你检查..只要匹配..不要拆分..考虑到这个词只包含字母表而不包含字母表numerics@rock321987我想了想,但这更容易,因为我知道如何使用regexmatch
也是regex@rock321987我没有考虑使用match
有效点,谢谢你,我喜欢你让它说“你好”的方式,我忍不住在撇号上不匹配。
lol。谢谢你,回答得好。回答得好!请注意,由于这是c#,您需要避开\like this[^\\s]+
我喜欢您让它说你好的方式,我忍不住不匹配撇号。
哈哈。谢谢,回答得好。回答得好!请注意,由于这是c#,您需要避开\like this[^\\s]+
我认为这个解决方案更合适,如果您添加一些可以在没有空格的情况下分隔单词的字符:“/”、“\”、“;”(csv数据)、“|”。另外,如果你要计算数字,你必须考虑操作符。我认为这个解决方案更合适,如果你添加几个字符,可以在没有空格的情况下分隔单词:“/”、“\”、“;”(csv数据)、“|”。另外,如果你要数数,你必须考虑操作符。