我有一个表达式
[A-E]|[A-E]{3}|[A-E]{4}
用于识别角(A,B,C,D,E)
或三角形(ABC,BCD)
等或矩形(ABCD,EDCB)
等的名称
,
我想改变表达式,以便用户不能输入具有相同字母的名称2次,名称如AAC或ABAE不应该是三角形或矩形的有效名称。
我在这里看到了这类问题的正则表达式解决方案,但不知道如何在flex上做到这一点,也找不到在flex手册模式上解决这个问题的方法。任何帮助/指南都会有帮助的。
谢谢
在flex中做到这一点最简单的方法可能是REJECT
:
[A-E]|[A-E]{3}|[A-E]{4} { for (int i = 0; i < yyleng-1; i++) {
if (strchr(yytext+i+1, yytext[i])) {
/* duplicate letter in string */
REJECT; } }
return whatever...; }
[A-Z]+ { return something_else...; }
有了这个,如果你有一个像ABA
这样的输入,它将匹配模式,但由于重复的A
,它将拒绝该匹配并去匹配次优模式(在这种情况下是[A-Z]+
)并返回something_else…
flex文档中的另一个注意事项:
'REJECT'在扫描器性能方面是一个特别昂贵的特性;如果在中使用任何的扫描器的动作,它将减慢所有扫描器的匹配。此外,'REJECT'不能与'-Cf'或'-Cf'选项一起使用
我已经这样做了
names [A-E]{4}|[A-E]{3}|[A-E]
%%
{names} {int i; for (i = 0; i < yyleng-1; i++) {
if (strchr(yytext+i+1, *yytext)) {
/* duplicate letter in string */
REJECT; } }
return printf( " %s :VALID NAME n", yytext ); }
[A-Z]+ { return printf( " %s :INVALID NAMEn", yytext ); }
但是它只适用于开头的重复字母表达式
交货阿坝:无效ABCD:有效ABCA:无效的
,
ABBA:valid(应该是无效的)ACBC:有效(应该无效)
我必须找到一种方法让我在任何情况下都能工作