问题描述
我想首先匹配单词之间的空格,然后想计算一个句子中空格的总数。我正在尝试以下方式,
%{
#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 Rahman。
输出: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 中匹配空格的正则表达式是:
([ ])
注意:两个方括号之间必须包含一个空格。