我有表情
[A-E]|[A-E]{3}|[A-E]{4}
它用于识别角度(A,B,C,D,E)或三角形等(ABC,BCD)或矩形(ABCD,EDCB)等的名称
但
我想更改表达式,以便用户不能输入具有相同字母的名称 2 次,诸如 AAC 或 ABAE 之类的名称不应该是三角形或矩形的有效名称。
我在这里看到了此类问题的正则表达式解决方案,但看不到我如何在 flex 上执行此操作,并且无法在 flex 手册的模式上找到解决此问题的方法。任何帮助/指南都会有所帮助。
谢谢
我有表情
[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”不能与“-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 NAME\n", yytext ); }
但它仅适用于表达式开头的重复字母
前 ABA:无效 ABCD:有效 ABCA:无效
但
ABBA :valid (应该是无效的) ACBC :valid (应该是无效的)
我必须找到一种方法让我适应各种情况