使用REGEX计算文本中的单词

时间:2014-07-16 11:35:20

标签: c# regex

你好:)我必须找到给定文本中的所有单词,但有以下限制:

匹配应该不区分大小写。并非所有匹配的子字符串都是单词,应该计算在内。单词是由标点符号或文本的开头/结尾分隔的一系列字母。输出应该是一个整数。

我已经用StringComparison和for循环解决了它。

以下代码是我尝试使用REGEX(C#)进行的。 它只给出了模式字的计数,但它没有意识到这些限制。

您能否提供一些有关如何改进我的REGEX模式的提示?

string patternWord = Console.ReadLine();
string[] inputSentence = Console.ReadLine().Split();
int count = 0;
string pattern = @"(?:\b\w+\ \s|\S)*" + patternWord + @"(?:\b\w+\b\ \s|\S)?";
Regex rx = new Regex(pattern, RegexOptions.IgnoreCase);
for (int i = 0; i < inputSentence.Length; i++)
{
    var mc = rx.Matches(inputSentence[i]);
    foreach (Match m in mc)
    {
        count++;
    }
}
Console.WriteLine("{0}", count);

编辑:

示例:

输入字 - 喜

输入句子 - 隐藏的网络只对日立设备说“嗨”,马图说。 HI

我只需要大胆的。

编辑2: 我也编辑了这些限制。

2 个答案:

答案 0 :(得分:2)

一个简单的单词破坏正则表达式怎么样?

\bhi\b

enter image description here

在C#中,这将实现如下:

private static int WordCount(string word, string text)
{
    var regex = new Regex(string.Format(@"\b{0}\b", word), 
                      RegexOptions.IgnoreCase);
    return regex.Matches(text).Count;
}

答案 1 :(得分:0)

很抱歉没有回答您的确切问题,但为什么要使用正则表达式? LINQ和Char类中的一些实用方法应该足够了:

using System.Linq;

public class Test
{
    static void Main(string[] args)
    {
        string patternWord = Console.ReadLine();
        string inputSentence = Console.ReadLine();
        var words = GetWords(inputSentence);
        var count = words.Count(word => string.Equals(patternWord, word, StringComparison.InvariantCultureIgnoreCase));
        Console.WriteLine(count);
        Console.ReadLine();
    }

    private static IEnumerable<string> GetWords(string sentence)
    {
        while (!string.IsNullOrEmpty(sentence))
        {
            var word = new string(sentence.TakeWhile(Char.IsLetterOrDigit).ToArray());
            yield return word;
            sentence = new string(sentence.Skip(word.Length).SkipWhile(c => !Char.IsLetterOrDigit(c)).ToArray());
        }
    }
}