我正在尝试匹配一个包含至少大写和至少一个小写字母的4到8个混合大小写字母的字符串。我试过[a-zA-z] {4,8},但它匹配像abba和CREEEDD这样只包含小写或大写字母的字符串。这可以在Lex中完成,还是需要以不同的方式完成?
答案 0 :(得分:2)
这会在正则表达式中呼叫&
(和)操作,然后执行以下操作:
((([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个字符的所有字符串是不是可行,以便检查是否存在大小写?也许你可以将第二个正则表达式应用于前者的结果。
作为旁注:对&
操作没有理论上的反对意见,因为确定性有限自动机在交叉点下是封闭的,尽管状态的数量可能会爆炸。它可能需要对非确定性有限自动机的通常解释器进行重大修改。
哦,如果有人感到挑战有所作为,那么也不要忘记补充。
答案 1 :(得分: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...