我是新手,一直在玩弄它。 现在要尝试做的任务是找出以下18个字符串中的多少个: pVV pVV pppVVV pppV pppVVV ppV pVVV pV pppVV pV ppVVV ppVV pVVV ppVV ppVVV pVV pppVVV pppVVV flex正则表达式至少部分或全部匹配一次: (ppp | VV)
我有以下代码,但是它提供了匹配的总数,并且对某些字符串进行了重复计数。我将如何更改此代码,使其仅与一个单词最多匹配一次?预先感谢!
%{
#include <stdlib.h>
#include <stdio.h>
int matches = 0;
%}
%%
(ppp|VV) { matches++; }
%%
int main()
{
yylex();
printf("%d\n", matches);
return 0;
}
答案 0 :(得分:1)
Flex是用于将输入流分析为令牌的工具。
它不是通用的正则表达式驱动程序。如果您的任务与将输入流拆分为单个标记无关,那么您可能使用了错误的工具。
我认为您要在此处执行的操作是将输入流划分为令牌,然后对令牌进行分类。 Flex可以用于此目的,但是您需要弄清楚令牌是什么。您还需要记住,整个输入流需要处理。您不能只在输入流中进行正则表达式搜索以查找您感兴趣的内容。所有内容-甚至是空格-都必须是某些标记的一部分。
在这种情况下,您的令牌似乎由
组成似乎是合理的但是,您没有说出您认为“单词”是什么。我们可以猜测一个单词是任何非空白字符序列,但是您可能具有更严格的定义。 (也许您只是指字母和数字。甚至只是字母。或者也许允许使用标点符号。)
在“单词”中,您感兴趣的是哪些包含序列ppp
或VV
。这样就为您提供了三种令牌:
ppp
或VV
的假设您确实是说“单词”是任何非空格字符序列,那么可以使用以下简单的伸缩模式集进行分类:
[[:space:]]+ ; /* Ignore whitespace */
[^[:space:]]*(ppp|VV)[^[:space:]]* { matches++; }
[^[:space:]]+ ; /* Ignore other words */
请注意,以上内容完全取决于您如何定义“单词”,而您尚未定义(至少,不在您的问题中)。因此,它可能与您的实际问题略有相似,但应该很容易适应。
有关正则表达式语法的完整说明,请阅读flex manual。语法应该很熟悉,但是它与任何正则表达式库都不相同,并且您会发现大多数在线正则表达式工具都不了解Flex的语法。