今天在某网站订票注册填写密码的时候各种不爽,出于好奇在订完票之后打开了控制台,在表单验证的地方看到如下代码:
// 只能为字母和数字或下划线中的两个的组合
var regis = new RegExp("(?![a-z]+$|[0-9]+$|_+$)^[a-zA-Z0-9_]{6,}$");
匹配规则很简单字母、数字、下划线 至少选两个,最让人不爽的是只能是下划线,体验之差暂且不说...
不过这个正则却引起了我的好奇,对 (?![a-z]+$|[0-9]+$|_+$)
的作用一直不解,于是想起环视来了,搜索之后看到了 这篇文章。
答案就是否定顺序环视,当 子表达式匹配成功
时 整个表达式匹配失败
,所以纯字母、纯数字、纯下划线的密码无法匹配...
但是当我把这个表达式粘帖到 Regexper 查看是却报错了,确实这个表达式把 ^
放在了中间不合常理,并且这个环视没有考虑大写字母和密码最大长度的问题,也许这个表达式这样修改会好一点吧:
// 区分大小写
var regis = /^(?!([a-z]+|[A-Z]+|\d+|_+)$)\w{6,20}$/;
关于环视的介绍给出的链接已经有详细的介绍,这里就不多说了,很久没写东西了,以前学的东西都还给老师了,实在是对不起各位老师啊,趁今天是教师节,祝各位老师节日快乐吧!!!
另外说一句,Javascript不支持逆序环视。
补充: 关于数组去重, 看到一个利用正则顺序否定环视的例子:
// 数组去重, 注: 这里需要保证数组中原本没有逗号(,)
var arr=["ba","bc","a","c","b","a","bc","ba","c","babc"];
(arr.reverse().join(",").match(/(\b[^,]+(?=,|$)+)(?!.*,\1(,|$))/g) || []).reverse();
(parseFloat(value) || '').toFixed(2).replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1,");