0

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

必须在大约 10000 个字符的样本集中的每次按键上计算计数,所以最好把它弄对。

4

3 回答 3

3

你真的需要在每次按键时重新计算整个事情吗?似乎除非你在两个空格之间,否则没有键但是~或空格可以改变单词的数量。对于那些特殊的键,您通常应该能够在本地确定单词数量的变化,而无需重新处理整个缓冲区。

无论如何,您不需要正则表达式。每次看到~.

于 2012-10-01T01:45:37.370 回答
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

于 2012-10-01T02:46:27.350 回答
0

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

假设我们有以下状态:

OUTSIDE
WORD
TILDEWORD

我们从OUTSIDE开始。然后我们可以开始处理每个字符,并确定接下来要进入哪个状态。

如果我们在OUTSIDE

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

  2. 如果我们看到一个波浪字符,进入TILDEWORD状态并增加单词计数器。

  3. 如果我们看到一个单词字符,进入WORD状态并增加单词计数器。

  4. 否则,就留在原地。

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

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

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

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

hello~happy fabulous world~testing is good

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

于 2012-10-01T02:15:22.120 回答