Regex 正则表达式匹配任何单词,flex中的某些单词除外

Regex 正则表达式匹配任何单词,flex中的某些单词除外,regex,flex-lexer,Regex,Flex Lexer,我想写一个正则表达式来匹配任何单词。 我使用[a-zA-Z]*除了一些单词,例如WORD1和WORD2 所以somethingsomething匹配,但是单词WORD1和WORD2不匹配。在flex中可能吗 我试过: [a-zA-Z]*|[^“WORD1”WORD2]和[a-zA-Z]*{-}[“WORD1”WORD2]但两者都不起作用 (现在我知道它们为什么不起作用,但我仍然不知道解决方案。)在lex/flex中,通常的方法是使用模式和规则的组合来选择所需的行为: 您可以创建一个lexer来

我想写一个正则表达式来匹配任何单词。 我使用
[a-zA-Z]*
除了一些单词,例如
WORD1
WORD2

所以
somethingsomething
匹配,但是单词
WORD1
WORD2
不匹配。在flex中可能吗

我试过:

[a-zA-Z]*|[^“WORD1”WORD2]
[a-zA-Z]*{-}[“WORD1”WORD2]
但两者都不起作用


(现在我知道它们为什么不起作用,但我仍然不知道解决方案。)

在lex/flex中,通常的方法是使用模式和规则的组合来选择所需的行为:

  • 您可以创建一个lexer来匹配(并忽略)这些单词,然后使用表达式来表示其他标识符,或者
  • 只需匹配所有标识符,并使用查找表筛选出结果

可以为您介绍的情况编写正则表达式

为了匹配除word之外的所有单词,您可以编写:

w|wo|wor|word[a-z]+|([^w]|w[^o]|wo[^r]|wor[^d])[a-z]*
但正如@Thomas和@rici所指出的,您有更好的解决方案(特别是在 你定义了一个具体的问题)

示例:“计算除单词之外的所有单词”“实际上非常简单(使用Thomas建议):

%%
int i;
单词{}
[a-z]+{i++;}
.|\n{}
{printf(“%d\n”,i);返回0;}
%%

(未经测试)

在flex正则表达式中不可用,是吗?@BobbleBobble:我真的不明白你在问什么。
[a-zA-Z]*
将不匹配
WORD1
,尽管它将匹配
WORD
。当遇到WORD1时,您希望发生什么?错误?不同的令牌类型?两个令牌?只有当我们知道您希望扫描
WORD1
的结果时,我们才能提供如何实现它的建议。“任何单词”是什么意思"? 就像在任何英语单词中一样,在这种情况下,你需要考虑撇号(或者你不会匹配像“don't”这样的单词)?
%%
  int i;

word        {    }
[a-z]+      {i++;}

.|\n        {    }
<<EOF>>     { printf("%d\n",i); return 0; }
%%