使用正则表达式的高效字数计数方法

时间:2012-10-01 01:21:50

标签: c++ c word-count

我正在寻求实现字数统计算法。但是,~two tildes~中出现的任何内容都被视为1个字。出于这个原因,我认为正则表达式可能是最好的方法吗?

必须在大约10000个字符的样本集上的每个按键上计算计数,这样才能做到正确。

3 个答案:

答案 0 :(得分:3)

你真的需要在每个按键上重新计算整个事情吗?似乎除非你在两个空格之间,否则除~或空格之外的任何键都不能改变单词的数量。对于那些特殊键,您通常应该能够在不重新处理整个缓冲区的情况下确定本地字数的变化。

无论如何,你不需要正则表达式。每次看到~时,只需翻转一个标记。

答案 1 :(得分:1)

str = str.Trim() + " ";

var count = 0;
var inWord = false;
var inTilde = false;

foreach (var c in str)
{
    switch (c)
    {
        case ' ':
        case '\t':
        case '\r':
        case '\n':
            if (!inTilde && inWord)
            {
                inWord = false;
                count++;
            }
        case '~':
            if (inTilde)
            {
                count++;
                inWord = false;
            }

            inTilde = !inTilde;
        default:
            inWord = true;
    }
}

未经测试,但非常直接......

另请注意,~hi one~two~three four~将计为hi one, two, three four,以及~hi one~two~three four,即使没有结束代字号。

答案 2 :(得分:0)

与数字计数器耦合的简单有限状态自动机应该可以正常工作。

假设我们有以下状态:

OUTSIDE
WORD
TILDEWORD

我们从 OUTSIDE 开始。然后我们可以开始处理每个角色,并找出下一个要进入的状态。

如果我们在 OUTSIDE

  1. 如果我们到达文件末尾,请留在原地。

  2. 如果我们看到一个波浪号字符,请转到 TILDEWORD 状态并抬起单词counter。

  3. 如果我们看到一个单词字符,请转到 WORD 状态并抬起单词counter。

  4. 否则,请留在原地。

  5. 其他两个州的案例分析应该类似。整个事情看起来几乎像一个棋盘游戏。

    ------> OUTSIDE <----------> WORD
               ^                   ^
               |                   |
               |                   V
               +-------------> TILDEWORD
    

    并编写C程序以跟踪我们在有限状态自动机中的位置是直接的。

    箭头可能是双向的。考虑一下这个输入:

    hello~happy fabulous world~testing is good
    

    问题陈述对我们在扫描另一个词时看到波浪号时发生的事情有点模糊;我怀疑我们必须把它算作一个单独的单词,所以上面是五个单词的序列。当然,您的解释可能会有所不同。考虑边缘情况!