用于连续重复字母、数字和特殊字符的Java正则表达式

用于连续重复字母、数字和特殊字符的Java正则表达式,java,regex,Java,Regex,我必须应用密码策略,并且我正在使用此正则表达式(默认为我的Identity Server),该正则表达式接受小写、大写、数字和特殊字符组合的密码: ^((?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%&*])).{0,100}$ 我需要对其进行修改,使其不应与具有相同字符的3个以上连续副本的字符串相匹配,例如Adminnnn@123这很棘手,但我认为这应该有效(): 我使用了4个先行断言和一个否定的先行断言 (?=.*[0-9]) mu

我必须应用密码策略,并且我正在使用此正则表达式(默认为我的Identity Server),该正则表达式接受小写、大写、数字和特殊字符组合的密码:

^((?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%&*])).{0,100}$

我需要对其进行修改,使其不应与具有相同字符的3个以上连续副本的字符串相匹配,例如
Adminnnn@123

这很棘手,但我认为这应该有效():

我使用了4个先行断言和一个否定的先行断言

(?=.*[0-9])         must contain a number 
(?=.*[a-z])         must contain a lower case
(?=.*[A-Z])         must contain an upper case
(?=.*[!@#$%&*])     must contain a special character
(?!.*(.)\1\1\1)     must not repeat the character in group 1 more than 3 times
[0-9a-zA-Z!@#$%&*]  is composed of these characters
{0,100}             0 to 100 symbols allowed

与其让它变得不必要的复杂,为什么不应用两个正则表达式呢?你的正则表达式对我不起作用。星号丢失了,对此表示抱歉。这里是正确的一个^((=**d)(=.*[aZ])(=.*[aZ])(?=*[](?),$$%和*]){ 0100 } $,而不是用正则表达式来解决这个问题,只考虑在代码中编码这些规则。读取代码时,正则表达式很难解码。此外,如果规则在某个时刻发生了变化,那么知道正则表达式的哪一部分可以安全地进行更改也就不足为奇了。如果您出于性能原因(似乎不太可能)选择正则表达式路径,请确保您实际测量的速度更快…@EmilH感谢您的建议和有效点,但在我的情况下,我没有选择更改代码。我只能使用属性文件来放置此正则表达式。
[0-9a-zA-Z!@$%&*]
不是必需的。将其替换为
@科学方法我认为许多密码的典型特征是没有空格,或者允许使用奇怪的ascii字符。可能会因为字符串的编码而出错。我知道这是有原因的。我也认为。将允许在密码中使用其他可能违反密码策略的特殊字符和空格,但感谢您的建议。
(?=.*[0-9])         must contain a number 
(?=.*[a-z])         must contain a lower case
(?=.*[A-Z])         must contain an upper case
(?=.*[!@#$%&*])     must contain a special character
(?!.*(.)\1\1\1)     must not repeat the character in group 1 more than 3 times
[0-9a-zA-Z!@#$%&*]  is composed of these characters
{0,100}             0 to 100 symbols allowed