0

我有表情

[A-E]|[A-E]{3}|[A-E]{4}

它用于识别角度(A,B,C,D,E)或三角形等(ABC,BCD)或矩形(ABCD,EDCB)等的名称

我想更改表达式,以便用户不能输入具有相同字母的名称 2 次,诸如 AAC 或 ABAE 之类的名称不应该是三角形或矩形的有效名称。

在这里看到了此类问题的正则表达式解决方案,但看不到我如何在 flex 上执行此操作,并且无法在 flex 手册的模式上找到解决此问题的方法。任何帮助/指南都会有所帮助。

谢谢

4

2 回答 2

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”不能与“-Cf”或“-CF”选项一起使用

于 2013-04-22T23:16:32.093 回答
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:无效

ABBA :valid (应该是无效的) ACBC :valid (应该是无效的)

我必须找到一种方法让我适应各种情况

于 2013-04-23T13:59:48.337 回答