正则表达式(Ruby):匹配非单词,但排除空格

时间:2014-05-12 13:12:23

标签: ruby regex regex-negation

^(?=(.*\d){4,})(?=(.*[A-Z]){3})(?!\s)(?=.*\W{2,})(?=(.*[a-z]){2,}).{12,14}$

上面的RegExp试图:

  • 匹配至少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 - 不应该匹配

rubular link

编辑提供进一步澄清:

基本上,我试图避免拼出POSIX [:punct:]类中的所有字符,即!"#$%&'()*+,./:;<=>?@\^_\ {|}〜-..这就是为什么我需要使用\ W ..但我也想排除空格

我可以使用第二双眼睛,以及更有经验的建议......

再次编辑,纠正子模式中指定的计数混淆,如下面接受的答案所述。

1 个答案:

答案 0 :(得分:1)

使用非空格.

,而不是使用点\S
^(?=(.*\d){3,})(?=(.*[A-Z]){2})(?=.*\W{1,})(?=(.*[a-z]){1,})\S{12,14}$
//                                                  here ___^^

这是一个错字match at least 4 digits - (?=(.*\d){3,}), 它应该是:

match at least 3 digits - (?=(.*\d){3,})

match at least 4 digits - (?=(.*\d){4,})

与其他计数相同。