Skip to content

Instantly share code, notes, and snippets.

@loskael
Last active August 8, 2018 03:10
Show Gist options
  • Save loskael/5d019933f02de9ef348c to your computer and use it in GitHub Desktop.
Save loskael/5d019933f02de9ef348c to your computer and use it in GitHub Desktop.
正则匹配中的环视

正则匹配中的环视

今天在某网站订票注册填写密码的时候各种不爽,出于好奇在订完票之后打开了控制台,在表单验证的地方看到如下代码:

    // 只能为字母和数字或下划线中的两个的组合
    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,");
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment