我已经过滤了以下内容:
(?=..*\d)(?=..*[a-z])(?=..*[A-Z]).{10,63}$这意味着:
(?=.{2,}\d)(?=..*[a-z])(?=..*[A-Z]).{10,63}然后,我想排除一个以字母u开头,以3到6位数字结尾的单词:
([uU][0-9]{3,6})但是,如何将这两种模式合并以执行以下操作:
它不应该允许以下操作,因为它分别是:
# does not have the required combination of characters
aaaaaaaaaaaaaaa
# is too long
asadsfdfs12BDFsdfsdfdsfsdfsdfdsfdsfdfsdfsdfsdfsdsfdfsdfsdfssdfdfsdfssdfdfsdfssdfdfsdfsdfsdfsdfsfdsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdfs
# contains the pattern that shouldn't be allowed
U0000ABcd567890
ABcd56U00007890
D4gF3U432234
D4gF3u432234
ABcd567890U123456应该允许以下内容:
# it has the required combination of characters
ABcd5678990
ABcd567890
# does contain a part of the disallowed pattern (`([uU][0-9]{3,6})`), but does not fit that pattern entirely
ABcd567890U12
ABcd5U12abcdf
s3dU00sDdfgdg
ABcd56U007890在这里创建和示例:https://regex101.com/r/4b2Hu9/3
发布于 2019-10-23 14:20:18
在您的模式中,您使用了一个前瞻性(?=..*\d),它的含义与您所设想的不同。
这意味着,如果右边直接的字符是2倍或2倍以上,那么除了换行符后面跟着一个单数,大写和小写变体也是一样的。
您可以将模式更新为:
^(?!.*[uU]\d{3,6})(?=(?:\D*\d){2})(?=(?:[^a-z]*[a-z]){2})(?=(?:[^A-Z]*[A-Z]){2}).{10,63}$各部分
^开始(?!.*[uU]\d{3,6})负前瞻,不要断言u或U,后面跟着3-6位数字。(?=(?:\D*\d){2})断言2位数(?=(?:[^a-z]*[a-z]){2})断言2个小写字符(?=(?:[^A-Z]*[A-Z]){2})断言2个大写字符.{10,63}匹配除换行符10-63次以外的任何字符。$末端发布于 2019-10-23 14:21:04
首先,确保字符串包含两个数字的方法是使用正的前瞻性:
(?=.*\d.*\d)您可以将其推广到其他过滤器。
要确保字符串包含10-63个字符,请执行以下操作:
.{10,63}您说您不希望字符串以u或U开头,后面跟着3到6位数字(假定7位数字可以),请使用负的前瞻性:
(?![uU]\d{3,6}\D)\D必须确保如果有7位数字,则字符串将被接受。
把这一切结合在一起:
r'^(?=.*\d.*\d)(?=.*[a-z].*[a-z])(?=.*[A-Z].*[A-Z])(?![uU]\d{3,6}\D).{10,63}$'https://stackoverflow.com/questions/58524330
复制相似问题