如果是我,我会构建字符数组 (char[] ...),它们代表您将允许的各种字符集,然后在您的生成器方法中选择适当的字符数组,并从中生成密码.复杂的部分就变成了创建字符数组...
public String generate(char[] validchars, int len) {
char[] password = new char[len];
Random rand = new Random(System.nanoTime());
for (int i = 0; i < len; i++) {
password[i] = validchars[rand.nextInt(validchars.length)];
}
return new String(password);
}
那么你的问题就变成了生成 char[] 数组来代表你拥有的各种规则,以及如何将这个集合传递给 generate 方法。
这样做的一种方法是设置与您允许的规则匹配的正则表达式规则列表,然后通过规则发送每个字符......如果它们匹配规则然后添加它们...... ..
考虑一个看起来像这样的函数:
public static final char[] getValid(final String regex, final int lastchar) {
char[] potential = new char[lastchar]; // 32768 is not huge....
int size = 0;
final Pattern pattern = Pattern.compile(regex);
for (int c = 0; c <= lastchar; c++) {
if (pattern.matcher(String.valueOf((char)c)).matches()) {
potential[size++] = (char)c;
}
}
return Arrays.copyOf(potential, size);
}
然后,您可以通过以下方式获得一个字母字符数组(仅限小写):
getValid("[a-z]", Character.MAX_VALUE);
或者,所有“单词”字符的列表:
getValid("\\w", Character.MAX_VALUE);
然后就变成了选择正则表达式来匹配您的要求,并“存储”每次重复使用的有效字符数组的情况。 (不要每次生成密码时都生成字符......)