【发布时间】: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