Java 正则表达式至少匹配字符串中任意顺序的2位数字和2个字母

Java 正则表达式至少匹配字符串中任意顺序的2位数字和2个字母,java,regex,Java,Regex,我正在尝试创建一个正则表达式来匹配模式(用于密码),其中字符串必须介于8到30个字符之间,必须至少有2个数字,至少有2个字母(不区分大小写),至少有1个特殊字符,并且没有空格 我已经让空格和特殊字符匹配工作,但我得到了2个数字和2个字母,因为它们不需要是连续的 i、 e.应匹配a1b2c$或ab12$或1aab2c$ 像这样的信件 (?=.*[a-zA-Z].*[a-zA-Z]) // Not sure. 下面的字符串有效,但仅当两个字母连续且两个数字连续时有效。如果字母、数字、特殊字符相互

我正在尝试创建一个正则表达式来匹配模式(用于密码),其中字符串必须介于8到30个字符之间,必须至少有2个数字,至少有2个字母(不区分大小写),至少有1个特殊字符,并且没有空格

我已经让空格和特殊字符匹配工作,但我得到了2个数字和2个字母,因为它们不需要是连续的

i、 e.应匹配
a1b2c$
ab12$
1aab2c$

像这样的信件

(?=.*[a-zA-Z].*[a-zA-Z])  // Not sure.
下面的字符串有效,但仅当两个字母连续且两个数字连续时有效。如果字母、数字、特殊字符相互交织,则无效

(?=^.{8,30}$)((?=.*\\d)(?=.*[A-Za-z]{2})(?=.*[0-9]{2})(?=.*[!@#$%^&*?]{1})(?!.*[\\s]))^.* 

我注意到您提供的示例不是8到30个字符

如果需要8-30个字符,请尝试此模式一次

 (?=[^\s]*[^\sa-zA-Z0-9][^\s]*)(?=[^\s]*[a-zA-Z][^\s]*[A-Za-z][^\s]*)(?=[^\s]*\d[^\s]*\d[^\s]*)[^\s]{8,30}

你的猜测很准确。用帕伦斯可以让它看起来更优雅一点

(?=(.*[a-zA-Z]){2})

听起来你的思路是对的。

如果你不希望字母必须是连续的
(?=.[a-zA-Z].[a-zA-Z])
是正确的方法。数字
(?=.*\\d.*\\d)
(?=(.*\\d){2})
也是如此

试试这个正则表达式

(?=^.{8,30}$)(?=(.*\\d){2})(?=(.*[A-Za-z]){2})(?=.*[!@#$%^&*?])(?!.*[\\s])^.*

使用循环遍历字符串:

/**
 * Checks to see if the specified string has between 8 and 30 characters, has at least 2 digits, at least 2 letters, at least one special character, and no spaces.
 * @param s the String to be checked
 * @return s, if it passes the above test
 * @throws IllegalArgumentException if it does not
 */
public static String check(String s)
{
    IllegalArgumentException invalid = new IllegalArgumentException();
    if(s.length() < 8 || s.length() > 30)
        throw invalid;
    int letters = 0, numbers = 0, specialChars = 0;
    for(char c : s.toCharArray())
    {
        if(c == ' ')
            throw invalid;
        else if(Character.isLetter(c))
            ++letters;
        else if(Character.isDigit(c))
            ++numbers;
        else
            ++specialChars;

    }
    if(letters < 2 || numbers < 2 || specialChars < 1)
        throw invalid;
    return s;
}
/**
*检查指定的字符串是否包含8到30个字符,是否包含至少2个数字,是否包含至少2个字母,是否包含至少一个特殊字符,是否包含空格。
*@param s要检查的字符串
*@return s,如果通过上述测试
*@如果没有,则抛出IllegalArgumentException
*/
公共静态字符串检查(字符串s)
{
IllegalArgumentException无效=新的IllegalArgumentException();
如果(s.长度()<8 | | s.长度()>30)
投掷无效;
整数字母=0,数字=0,特殊字母=0;
for(char c:s.toCharArray())
{
如果(c='')
投掷无效;
else if(字符号:c))
++信件;
else if(字符isDigit(c))
++数量;
其他的
++特种车;
}
如果(字母<2 | |数字<2 | |特殊字符<1)
投掷无效;
返回s;
}

您绝对确定需要regexp吗?我反对使用regex,只需使用if语句和某种字符串.contains()函数对每个正则表达式进行单独检查即可。gparyani给出了一个比regexIt更合适的解决方案,看起来我需要regex,因为这是Liferay配置的一部分efficient@AlexChannelmeter哪一部分需要解释?无论如何,我猜你可能在找:。也许这会有点帮助