【问题标题】:RegEx for at least an uppercase, a lower case, a number and a special characterRegEx 至少包含一个大写字母、一个小写字母、一个数字和一个特殊字符
【发布时间】:2019-05-21 15:26:06
【问题描述】:

我正在编写一个 android 正则表达式来检查包含的密码,我使用的正则表达式是

^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[\W_]).{8,16}$

但我的 Matcher 类总是返回 false

     Matcher matcher;

        Pattern pattern = Pattern.compile(context.getString(R.string.password_validation_value));

matcher = pattern.matcher(password); // always returns false

我该如何解决这个问题?

【问题讨论】:

  • 只需在每个断言中的点后放置一个量词。例如(?=.*\d)。另外,不要使用\W,因为它匹配空格和控制字符。或者,改用这个(?=.*(?=[\x21-\x7e])[\W_])
  • @Aaron 我不完全理解
  • @sln 我也不明白你的答案,你能解释一下吗,另外我是这个正则表达式的新手
  • 因为你已经编辑了你的问题,我的评论是无效的(我已经删除了它),但是当你有 ^(?=.\d)(?=.[a-z]) 它意味着“在字符串的开头,检查下一个字符是whatever,后面是数字。还要检查下一个字符是否是whatever,后面是小写字母“。当然,第二个角色不可能同时是两个角色。现在您使用了(?=.*thing),这不再是问题,因为这将匹配您在字符串中的任何位置寻找的thing,而不是专门作为第二个字符
  • matcher = pattern.matcher(password); 不返回 false。你会在它之后运行matcher.matches() 吗?

标签: regex regex-lookarounds regex-group regex-greedy


【解决方案1】:

好的,这里解释一下

^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*\p{P}).{6,16}$

解释

 ^                     # Beginning of string
 (?= .* \d )           # Assert, string contains a digit
 (?= .* [a-z] )        # Assert, string contains a lower case letter
 (?= .* [A-Z] )        # Assert, string contains a upper case letter
 (?= .* \p{P} )        # Assert, string contains a punctuation character
 .{6,16}               # Consume 6 to 16 characters
 $                     # End of string

【讨论】:

    猜你喜欢
    • 2021-01-26
    • 1970-01-01
    • 2016-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    • 2010-12-07
    • 2017-07-06
    相关资源
    最近更新 更多