我有表达式
[A-E]|[A-E]{3}|[A-E]{4}
用于识别角度(A,B,C,D,E)
或三角形(ABC,BCD)
ect或Rectangles (ABCD,EDCB)
等名称
BUT
我想更改表达式,以便用户CANT输入具有相同字母2次的名称,此类AAC或ABAE的名称不应是trianlge或矩形的有效名称。
我已经看到了这类问题here的正则表达式解决方案,但是无法看到我如何在flex上做到这一点,并且无法找到解决这个问题的方法来解决这个问题。任何帮助/指南都会有所帮助。
感谢
答案 0 :(得分:1)
在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'选项一起使用
答案 1 :(得分:0)
我已经完成了这个
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 NAME\n", yytext ); }
但它仅适用于处于开头的重复字母 表达
离 ABA:无效 ABCD:有效 ABCA:无效
BUT
ABBA:有效(应无效) ACBC:有效(应该无效)
我必须找到一种让我适应各种情况的方法