重复一组字符
我有这个表达
[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