正则如何取反?

/^1\d{10}$/

上面的正则是匹配1开头的11位手机号,我现在有一个原生的input,想控制只允许上面的输入,怎么实现?

 <input name="mobile" onkeyup="value=value.replace(/^1\d{10}$/,'')">

网上有这样写的,但里面的那个正则,如何取反呢?

阅读 13.2k
2 个回答
<input type="text" name="" id="" onkeyup="replace(this)" onkeydown="replace(this)">
<script>
function replace(_this) {
    _this.value = _this.value.replace(/[^\d]+|^[^1]|1(\d{10})\d$/, function(res, $1) {
        if ($1) return '1' + $1;
        return '';
    });
}
</script>
  • 首先[^\d]非数字的不要
  • ^[^1]不是1开头的不要
  • (\d{10})10个连续数字分组
  • \d1+10位数后的数字

函数部分:

  • onkeyup只能监听弹起,为避免用数长按不放还需要监听onkeydown
  • replace回调函数中,先判断是否有满足\d{10}连续10位数的,有的话,不管怎样直接返回1+$1,也就是1和剩余10位
  • 其他情况返回 ''(事实上正则是先匹配这些情况,因为\d{10}在最后)

目前测试通过的情况有以下几点:

  • 输入非1开头的任意字符
  • 长按情况
  • 输入超过11位
  • 数字中间插入其他字符

如果还有其他情况的话,就自己试着加逻辑吧

可以采用分组匹配,第一组固定为号码格式,第二组匹配任意字符串,然后只保留第一组:

'1100645271312345abc莫等闲'.replace(/(^1\d{10})(\S*)/, '$1');
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题