我如何让Flex匹配正则表达式每个单词最多一次

时间:2018-10-17 20:46:37

标签: flex-lexer

我是新手,一直在玩弄它。 现在要尝试做的任务是找出以下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;
}

1 个答案:

答案 0 :(得分:1)

Flex是用于将输入流分析为令牌的工具。

它不是通用的正则表达式驱动程序。如果您的任务与将输入流拆分为单个标记无关,那么您可能使用了错误的工具。

我认为您要在此处执行的操作是将输入流划分为令牌,然后对令牌进行分类。 Flex可以用于此目的,但是您需要弄清楚令牌是什么。您还需要记住,整个输入流需要处理。您不能只在输入流中进行正则表达式搜索以查找您感兴趣的内容。所有内容-甚至是空格-都必须是某些标记的一部分。

在这种情况下,您的令牌似乎由

组成似乎是合理的
  • “单词”
  • 其他一切。

但是,您没有说出您认为“单词”是什么。我们可以猜测一个单词是任何非空白字符序列,但是您可能具有更严格的定义。 (也许您只是指字母和数字。甚至只是字母。或者也许允许使用标点符号。)

在“单词”中,您感兴趣的是哪些包含序列pppVV。这样就为您提供了三种令牌:

  • 所有不是单词的东西
  • 包含pppVV
  • “单词”
  • 其他“单词”。

假设您确实是说“单词”是任何非空格字符序列,那么可以使用以下简单的伸缩模式集进行分类:

[[:space:]]+                        ; /* Ignore whitespace */
[^[:space:]]*(ppp|VV)[^[:space:]]*  { matches++; }
[^[:space:]]+                       ; /* Ignore other words */

请注意,以上内容完全取决于您如何定义“单词”,而您尚未定义(至少,不在您的问题中)。因此,它可能与您的实际问题略有相似,但应该很容易适应。

有关正则表达式语法的完整说明,请阅读flex manual。语法应该很熟悉,但是它与任何正则表达式库都不相同,并且您会发现大多数在线正则表达式工具都不了解Flex的语法。