【发布时间】:2014-05-12 13:12:22
【问题描述】:
^(?=(.*\d){4,})(?=(.*[A-Z]){3})(?!\s)(?=.*\W{2,})(?=(.*[a-z]){2,}).{12,14}$
上面的正则表达式试图:
- 至少匹配 4 位数字 -
(?=(.*\d){4,}) - 完全匹配 3 个大写字母 -
(?=(.*[A-Z]){3}) - 不匹配空格 -
(?!\s) - 至少匹配 2 个非单词字符 -
(?=.*\W{2,}) - 至少匹配 2 个较低的 -
(?=(.*[a-z]){2,}) - 字符串长度必须在 12 到 14 之间 -
.{12,14}
但我在避免匹配空格方面遇到了挑战。似乎因为 \W 还包含空格,所以我之前对空格的否定前瞻被忽略了。
例如:
-
b4A@Ac33*8Pd-- 应该匹配 -
b4A@Ac3 3*8Pd-- 不应该匹配
已编辑以提供进一步说明:
基本上,我试图避免拼写 POSIX [:punct:] 类中的所有字符,即 !"#$%&'()*+,./:;<=>?@\^_\{|}~-` .. 这就是我需要使用 \W 的原因。 . 但我也想排除空格
我可以用第二双眼睛,在这里更有经验的建议..
再次编辑,以纠正子模式中指定的计数混淆,如下面接受的答案中所指出的。
【问题讨论】:
-
您能否添加一个应该匹配但不匹配的测试,或者添加一个不应该匹配但匹配的文本?
-
我和@UriAgassi 在一起 - 它让提问者的生活更轻松
-
我认为您的问题不在于
\W,而在于.*- 删除(?=.*\W{1,})并查看... -
你的rubular链接错了吗?你说的是
\W{1,},而rubular链接正则表达式是\W{1},还有其他区别 -
在我看来
(?!\s)不起作用:rubular.com/r/e8cEKt3cEn 我不知道为什么,它应该对我来说......你可以尝试要求一个不包括空格的正则表达式
标签: ruby regex regex-negation