少なくとも大文字と少なくとも 1 つの小文字を含む 4 ~ 8 個の大文字と小文字が混在する文字列を一致させようとしています。[a-zA-z]{4,8} を試してみましたが、abba や CREEEDD などの小文字または大文字のみを含む文字列に一致します。これは Lex でできることですか、それとも別の方法で行う必要がありますか?
2 に答える
これは&
、正規表現での (and) 操作を求めているため、次のようにします。
((([a-zA-Z]*([a-z][a-zA-Z]*[A-Z])|([A-Z][a-zA-Z]*[a-z]))[a-zA-Z]*)&([a-zA-Z]{4,8})
しかし、その操作は存在しません。もちろん、大文字と小文字が混在する位置の可能性をすべて列挙することもできますが、それは膨大な表現になります。
4 ~ 8 文字のすべての文字列をフィルタリングして、小文字と大文字の両方が存在するかどうかを別の方法でチェックすることは可能ではないでしょうか? おそらく、前者の結果に 2 番目の正規表現を適用できます。
&
補足として:状態の数が爆発的に増加する可能性があるにもかかわらず、決定論的有限オートマトンは交差の下で閉じているため、操作に対する理論的な異議はありません。おそらく、非決定性有限オートマトンの通常のインタープリターを大幅に変更する必要があると思われます。
ああ、誰かが違いを生むことに挑戦していると感じたら、補完することも忘れないでください.
0 個以上の大文字と小文字が混在する文字列の後に、大文字、0 個以上の大文字と小文字が混在する文字、小文字、および 0 個以上の大文字と小文字が混在する文字、または大文字の前に小文字がある同様のパターンが続く文字列が必要です。場合。
しかし、それは面倒です。したがって、単純化を試みることができます。最初の文字は大文字である可能性があるため、その後に 0 個以上の大文字と小文字の混合文字、小文字、および 0 個以上の大文字と小文字の混合文字が続く必要があります。または、最初の文字が小文字である可能性があるため、その後に 0 個以上の大文字と小文字の混合文字、および 0 個以上の大文字と小文字の混合文字が続く必要があります。
[a-z][a-zA-Z]*[A-Z][a-zA-Z]*|[A-Z][a-zA-Z]*[a-z][a-zA-Z]*
残っている問題は、合計の長さを 4 ~ 8 文字の範囲に制限することです (最近のパスワードでは、アルファベット 8 文字だけでは哀れです。句読点と数字を使用し、8 文字を超える文字を使用できます)。パターンが認識された後、アクションで長さの検証を実装します。
または、おそらくもっと簡単に、既存のルールを使用します。
[a-zA-Z]{4,8}
アクションで大文字と小文字が混在する検証を適用します。
if (islower(yytext[0]) && strpbrk(yytext, "ABCDEFGHIJKLMNOPQRSTUVWXYZ") == 0)
...reject...
else if (isupper(yytext[0]) && strpbrk(yytext, "abcdefghijklmnopqrstuvwxyz") == 0)
...reject...