FLEX 的句子中单词之间的空格匹配的正则表达式是什么?

问题描述

我想首先匹配单词之间的空格,然后想计算一个句子中空格的总数。我正在尝试以下方式,

%{
#undef yywrap
#define yywrap() 1
int VowelCount = 0;
int ConsonantCount=0;
int CountWhiteSpace=0;
int CountNewLine=0;
int CountInteger=0;
int CountFloat=0;
%}
%%
[aeIoUAEIoU] {++VowelCount;}
[bcdBCDfghFGHjklmnJKLMNpqrstPQRSTvwxyzVWXYZ] {++ConsonantCount;}
[0-9] {++CountInteger;}
[0-9]*[.][0-9]+ {++CountFloat;}
[\s]  {++CountWhiteSpace;}
\n    {++CountNewLine;}
end {return 0;}       
%%
int main(){
yylex();
printf("\nNumber of vowel in the given input  %d\n",VowelCount);
printf("\nNumber of consonant in the given input %d\n",ConsonantCount);
printf("\nNumber of integer in the given input %d\n",CountInteger);
printf("\nNumber of float in the given input %d\n",CountFloat);
printf("\nNumber of line in the given input %d\n",CountNewLine);
printf("\nTotal white space count %d\n",CountWhiteSpace); 
return 0;
}

但我收到类似的错误

第 16 行:警告,无法匹配规则。
我能够实现元音、辅音、换行、整数和浮点数,但我面临着空格数。我想用以下方式计算空格:
输入:我是 Ashqur Ra​​hman。
输出:3 //单词 I、am、Ashiqur、Rahman 之间的空格数。
我怎样才能在 FLEX 中实现它?提前致谢。

解决方法

如果只想匹配一个空格字符,可以使用" "[ ]。但这并不等同于典型正则表达式库中的 \s,后者将匹配任何单字节空白字符,包括制表符和换行符。 Flex 无法识别转义序列,如 \s\d\w,它们可能适用于正则表达式包。

Flex 确实有两个内置集,您可以在字符类中使用它们。 (请注意,“在字符类中”意味着您需要用额外的 […] 将它们括起来):

  • [:space:] 的意思正是 \s 的意思:任何空白字符,水平或垂直。
  • [:blank:] 只是水平空白:空格和制表符。

您可以将这些与字符类中的其他字符自由组合。因此,[[:blank:]] 将匹配单个空格或制表符,而 [[:space:],;] 将匹配任何空白字符以及逗号和分号。

通常,您希望匹配一个序列空白字符,而不仅仅是一个。否则,你会误算单词; the other one 有四个空格,但只有三个词。

要匹配一个序列,请使用“一次或多次重复”运算符,+[[:space:]]+。这也更有效率。它也不会阻止您计算字符数,因为在操作中变量 yyleng 是模式匹配的字符数。

有关详细信息,请参阅 Flex manual

,

我在遇到问题时提出了这个问题。现在我已经解决了我的问题,我在这里发布答案,以便需要这个问题的答案的人可以受益。

在 FLEX 中匹配空格的正则表达式是:

([ ])

注意:两个方括号之间必须包含一个空格。