请问 这个 js 正字表达式是如何做到校验必须包含数字和字符的?

2017-01-12 14:56:25 +08:00
 wlbcs

功能是校验密码必须包含 6-12 位字母和数字 确实能用

var rex = /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,12}$/;

后面的 [0-9A-Za-z]{6,12}$ 我能理解 但前面的两个分组 (?![0-9]+$) (?![a-zA-Z]+$) 是啥意思?

2126 次点击
所在节点    问与答
11 条回复
xujinkai
2017-01-12 15:01:52 +08:00
(?!)表示“后边的字符串不是” 所以既不是纯数字也不是纯字母 查一下正则规则就知道了
013231
2017-01-12 15:03:43 +08:00
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#special-negated-look-ahead

x(?!y)

Matches 'x' only if 'x' is not followed by 'y'. This is called a negated lookahead.

For example, /\d+(?!\.)/ matches a number only if it is not followed by a decimal point. The regular expression /\d+(?!\.)/.exec("3.141") matches '141' but not '3.141'.
wlbcs
2017-01-12 15:37:15 +08:00
@xujinkai 这个解释很给力


但为啥 (?![0-9]+$) 可以表示不能全是数字呢?


里面的 $ 是表示句尾吗还是有其他含义?
Pastsong
2017-01-12 15:40:48 +08:00
lcorange
2017-01-12 15:46:20 +08:00
@wlbcs
[0-9]+表示 1 到多个纯数字
[0-9]+$表示匹配到句尾的多个纯数字
(?![0-9]+$)不要上面的情况出现
kevin1852
2017-01-12 15:57:41 +08:00
qyc666
2017-01-12 17:03:27 +08:00
负向前瞻
xujinkai
2017-01-12 17:21:48 +08:00
@wlbcs $是句尾,所以[0-9]+$表示到结尾都是数字,然后再用(?!)括起来,表示后边不能都是数字。我推荐 https://regex101.com/ 这个网站,多试试就知道了
h4x3rotab
2017-01-12 18:49:42 +08:00
写这种正则,还不如老老实实用 for 循环判断
rrfeng
2017-01-12 20:13:06 +08:00
@Pastsong
这个神器有问题啊, [0-9]+ 可不是 one of ……
wlbcs
2017-01-12 21:39:52 +08:00
@xujinkai 谢谢!
没想到分组还能这么用

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/334128

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX