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我想了想,但这更容易,因为我知道如何使用regex
match
也是regex@rock321987我没有考虑使用
match
有效点,谢谢你检查..只要匹配..不要拆分..考虑到这个词只包含字母表而不包含字母表numerics@rock321987我想了想,但这更容易,因为我知道如何使用regex
match
也是regex@rock321987我没有考虑使用
match
有效点,谢谢你,我喜欢你让它说“你好”的方式,我忍不住在撇号上不匹配。
lol。谢谢你,回答得好。回答得好!请注意,由于这是c#,您需要避开\like this
[^\\s]+
我喜欢您让它说
你好的方式,我忍不住不匹配撇号。
哈哈。谢谢,回答得好。回答得好!请注意,由于这是c#,您需要避开\like this
[^\\s]+
我认为这个解决方案更合适,如果您添加一些可以在没有空格的情况下分隔单词的字符:“/”、“\”、“;”(csv数据)、“|”。另外,如果你要计算数字,你必须考虑操作符。我认为这个解决方案更合适,如果你添加几个字符,可以在没有空格的情况下分隔单词:“/”、“\”、“;”(csv数据)、“|”。另外,如果你要数数,你必须考虑操作符。