我正在寻找实现字数统计算法。但是,其中出现的任何内容都~two tildes~
被视为 1 个单词。出于这个原因,我认为正则表达式可能是最好的方法?
必须在大约 10000 个字符的样本集中的每次按键上计算计数,所以最好把它弄对。
我正在寻找实现字数统计算法。但是,其中出现的任何内容都~two tildes~
被视为 1 个单词。出于这个原因,我认为正则表达式可能是最好的方法?
必须在大约 10000 个字符的样本集中的每次按键上计算计数,所以最好把它弄对。
你真的需要在每次按键时重新计算整个事情吗?似乎除非你在两个空格之间,否则没有键但是~
或空格可以改变单词的数量。对于那些特殊的键,您通常应该能够在本地确定单词数量的变化,而无需重新处理整个缓冲区。
无论如何,您不需要正则表达式。每次看到~
.
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
与数字计数器耦合的简单有限状态自动机应该可以正常工作。
假设我们有以下状态:
OUTSIDE
WORD
TILDEWORD
我们从OUTSIDE开始。然后我们可以开始处理每个字符,并确定接下来要进入哪个状态。
如果我们在OUTSIDE:
如果我们到达文件的末尾,请留在原处。
如果我们看到一个波浪字符,进入TILDEWORD状态并增加单词计数器。
如果我们看到一个单词字符,进入WORD状态并增加单词计数器。
否则,就留在原地。
其他两个州的案例分析应该类似。整个事情看起来几乎就像一个棋盘游戏。
------> OUTSIDE <----------> WORD
^ ^
| |
| V
+-------------> TILDEWORD
编写 C 程序来跟踪我们在有限状态自动机中的位置是直接的。
箭头可能是双向的。考虑这个输入:
hello~happy fabulous world~testing is good
当我们在扫描另一个单词时看到波浪号时会发生什么,问题陈述有点模糊。我怀疑我们必须把它算作一个单独的词,所以上面是五个词的序列。当然,您的解释可能会有所不同。考虑边缘情况!