重复一组字符

我有这个表达

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

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

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

我已经看到了这种类型的问题的正则表达式的解决方案,但不能看到我如何能做到这一点在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 ,它会拒绝匹配,并匹配下一个最好的模式(在这种情况下为[AZ]+ )并返回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 ); }

但它仅适用于表达式开头的重复字母

前ABA:无效ABCD:有效ABCA:无效

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

我必须找到一种方法让我为每一种情况工作

链接地址: http://www.djcxy.com/p/57869.html

上一篇: repetition of a set of characters

下一篇: Common difficulty with Flex++