0

我正在尝试匹配包含至少一个大写和至少一个小写字母的 4 到 8 个混合大小写字母的字符串。我试过 [a-zA-z]{4,8} 但它匹配像 abba 和 CREEEDD 这样只包含小写或大写字母的字符串。这是可以在 Lex 中完成的,还是我需要以不同的方式完成?

4

2 回答 2

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 个字符的字符串以不同方式检查是否存在小写和大写是否可行?也许您可以将第二个正则表达式应用于前者的结果。

作为旁注:理论上没有反对该&操作的反对意见,因为确定性有限自动机在交集下是封闭的,尽管状态的数量可能会爆炸。它可能需要对非确定性有限自动机的常用解释器进行重大修改。

哦,如果有人觉得有挑战要有所作为,那么也不要忘记补充。

于 2013-04-15T17:14:54.370 回答
1

您需要一个包含零个或多个混合大小写字母的字符串,后跟一个大写字母、零个或多个混合大小写字母、一个小写字母和零个或多个混合大小写字母,或类似的模式,小写字母在大写字母之前案子。

但是,这很混乱。所以,我们可以尝试简化。第一个字符可能是大写的,所以我们需要它后跟零个或多个混合大小写字母,一个小写字母,以及零个或多个混合大小写字母。或者第一个字符可能是小写的,所以我们需要它后面跟着零个或多个混合大小写字母,一个大写字母,再有零个或多个混合大小写字母。

[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...
于 2013-04-15T17:17:13.387 回答