如何将必填非字母数字字符的正则表达式改为可选匹配并验证方案?
正则表达式修改问题解答
你的自拟正则^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.?[a-zA-Z\d]).{8,72}$不可行,原因如下:
- 额外添加的
(?=.?[a-zA-Z\d])正向预查完全冗余。前面的三个预查已经强制要求字符串包含至少一个小写字母、一个大写字母和一个数字,这些都属于[a-zA-Z\d]的范畴,所以这个预查必然成立,对匹配没有任何实际限制,纯属多余。 - 这个正则并没有正确实现“非字母数字字符可选”的需求——原正则的核心是去掉
(?=.*[^a-zA-Z\d])这个强制要求至少一个非字母数字的预查,而不是添加无意义的预查。
正确的正则表达式
要实现“必须包含小写、大写、数字,非字母数字可选,长度8-72”的需求,直接保留前三个强制预查,去掉原正则中要求非字母数字的预查即可:
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,72}$
如果想要更明确地表示“非字母数字可选”(虽然没必要,但写法上更清晰),可以用逻辑或来保留可选的预查:
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?:(?=.*[^a-zA-Z\d])|).{8,72}$
这里的(?:(?=.*[^a-zA-Z\d])|)表示“要么存在至少一个非字母数字,要么不存在”,和去掉该预查的效果完全一致。
内容的提问来源于stack exchange,提问作者O S
相关产品推荐
相关产品推荐

