0

表情があります

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

(A,B,C,D,E)角度または三角形の(ABC,BCD)ectまたは長方形の(ABCD,EDCB)ectの名前を認識するように作られています

しかし

ユーザーが同じ文字の名前を 2 回入力できないように式を変更したいのですが、AAC や ABAE などの名前は三角形や四角形の有効な名前であってはなりません。

ここでこの種の問題の正規表現ソリューションを見てきましたが、フレックスでこれを行う方法がわかりませんし、フレックスマニュアルのパターンでこれを解決する方法を見つけることもできません。どんなヘルプ/ガイドも役に立ちます。

ありがとう

4

2 に答える 2

1

フレックスでこれを行う最も簡単な方法は、おそらく次の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 を返します...

また、フレックスのドキュメントから注意してください:

「REJECT」は、スキャナーのパフォーマンスの点で特に高価な機能です。スキャナーのアクションのいずれかで使用すると、スキャナーのすべてのマッチングが遅くなります。さらに、「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 ); }

ただし、式の先頭にある重複した文字に対してのみ機能します

ex ABA :無効 ABCD:有効 ABCA:無効

しかし

ABBA :valid (無効である必要があります) ACBC :valid (無効である必要があります)

あらゆる状況に対応できる方法を見つけなければならない

于 2013-04-23T13:59:48.337 に答える