Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何匹配字符串中的1个字符_Java_Regex_String_Character_Match - Fatal编程技术网

Java 如何匹配字符串中的1个字符

Java 如何匹配字符串中的1个字符,java,regex,string,character,match,Java,Regex,String,Character,Match,我正在为密码策略编写代码 政策规定,你不能拥有你已经使用过的同一封信。 密码-你不能使用密码,因为它有两个's' 我该怎么做 编辑: 以下是我的完整实现: private static final String PASSWORD_DUPLICATE_CHARACTERS = "^(?:([a-zA-Z])(?!.*\\1))$"; pattern = Pattern.compile(PASSWORD_DUPLICATE_CHARACTERS); this.checkForDuplicateLe

我正在为密码策略编写代码

政策规定,你不能拥有你已经使用过的同一封信。 密码-你不能使用密码,因为它有两个's'

我该怎么做

编辑:

以下是我的完整实现:

private static final String PASSWORD_DUPLICATE_CHARACTERS = "^(?:([a-zA-Z])(?!.*\\1))$";

pattern = Pattern.compile(PASSWORD_DUPLICATE_CHARACTERS);
this.checkForDuplicateLetters(LDAPNewUserPassword);

private boolean checkForDuplicateLetters(final String newPassword) throws LDAPException{
    LoggingEnt userEnt = new LoggingEnt();
    String userid = userEnt.getUseridCode();
    boolean foundDuplicate = false;

    matcher = pattern.matcher(newPassword);

    if (newPassword.matches(PASSWORD_DUPLICATE_LETTERS)){
        foundDuplicate = true;
        userEnt.setMsg1("Duplicate.");
        throw new LDAPException("Invalid password combination for " + userid, LDAPException.INVALID_CREDENTIALS);//BAristo
    } else {
        userEnt.setMsg1("Your password has been successfully changed.");
    }

    return matcher.matches();
}

您可以按如下方式使用:

<snip> PASSWORD_PATTERN_LOWER_8 = "(?i)^(?!.*(.).*\\1)";
性能不会很好,特别是对于较长的字符串,因为在最坏的情况下,每个字符都必须与其他字符进行比较

例如,密码
.qwertzuiopasdfghjklöyxcvbnm,.
仅在正则表达式引擎执行1000多个步骤后才会被检测为无效,而
qwertzuiopasdfghjklöyxcvbnm,…
将立即失败

最好先对字符串排序,然后直接查找后续字符:

<snip> PASSWORD_PATTERN_LOWER_8 = "(?i)^(?!.*(.)\\1)";
PASSWORD\u PATTERN\u LOWER\u 8=“(?i)^(?。*()\\1)”;
使用此正则表达式:

private static final String PASSWORD_PATTERN_LOWER_8 = "^(?:([a-zA-Z])(?!.*\\1))$";

我会用这样的东西

^((.)(?!.*\1))+$

这将匹配字符串中任何地方都没有重复字符的字符串

这个正则表达式的优点是它可以在字符串中的任何地方找到重复的字母。另一方面,它现在只允许在密码中使用字母,甚至允许使用空字符串…好的一点,尽管您也可以在匹配字符类中添加更多字符以及最小匹配数。基于OP问题,我在显示正则表达式时没有附加限制。即使没有重复的字母,也不会阅读小写字母。请帮帮我。还有别的办法吗?对我有用。此正则表达式的密码最小限制为6个字符。如果您不需要{6,},请删除它。在您提供的正则表达式上,Pasw70rd和password失败。一个没有副本,另一个有,但都失败了。这是你唯一的限制吗?或者您是否在单独的规则中实施了多个限制?可能应该提到,这对于密码策略不是一个好主意,因为它极大地减少了搜索空间。@Tim Pietzcker没有。我已经将其分解为几个序列,以使代码对其他程序员可读,而这些程序员在我离开后将取代我的位置。它不必是后续的相同字符。另一个例子是“姐妹”。如果已使用“S”,则无法再使用它。
^((.)(?!.*\1))+$