正则只匹配0-9,输入其他的直接输入不进去

1.项目中有个input,number类型,做了层校验,如下:value是Input的value值
有人纠结这个value=value,问题不在这,正则执行了一次,之后没在执行
var value=input.value
2.var reg=new RegExp(/[0-9]/g)
if(!reg.test(value)){

 input.value=value;

}
意思就是当输入的不是[0-9]的时候,让它等于它本身,但是有bug,
①直接输入‘.' 确实输入不上,但是先输入1在输入点就能输入点了了
②输入'e'或者'-'的时候,input的value值会置空,比如输入了32,然后输入e或者-,input的值就变为空了(输入别的字母没事)
③而我想的是只能输入0-9,输入别的时候直接输入不上就可以了。
④正则好像有个坑,只匹配一次

阅读 10.6k
10 个回答

先保留上一次的值, 两次做比对, 如果第二次有错误字符, 把上一次的值填写input框

看你选了Vue.js标签
可以绑定@input事件和@change事件。

// template
<input type="text" placeholder="不限"
    v-model="target"
    @input="inputDigit($event, 'target')"
    @change="inputDigit($event, 'target')"
>
// methods
inputDigit(event, name){
    let result = event.target.value;
    let reg = /(?:[1-9]\d{0,10})/;
    if(result !== ''){
        result = reg.exec(result);
        result = result === null ? '' : result[0];
    }
    event.target.value = result;
    this[name] = result;
},

// 正则可以自定义,关键在于@input事件和@change事件。

每次都把非数字replace掉,然后设置回input.value。

其实没完全明白题主的意思.
但根据"③而我想的是只能输入0-9,输入别的时候直接输入不上就可以了。"你想做的是仅支持0-9的输入?
首先你的正则是有问题的.

/[0-9]/g

指的是被校验的字符串是否包含[0-9]范围内的数字.
正确的应该是/^\d*$/g^[0-9]*$, 这样仅支持[0-9]任意个数字了.
另外:
不要写value=value;的代码,毫无意义且容易迷惑.

  1. 首先:如果input的type是number的话应该是已经不允许输入非数字字符了吧,还可以添加max、min的设置,应该足以满足你的需求,
  2. 其次,如果你想排除非数字输入的话,应该使用input事件来监听输入的变化,在输入变化时,先保存上一次的值[可以使用全局变量、或者元素的data属性绑定],再获取当前输入的值,然后检查是否满足,你写的正则表达式只是匹配输入值值中是否有一个数字,有数字就成功,没数字就返回false,应该/^[0-9]*$/这样正则匹配,满足的话就使用现在的值,不满足的话,回退之前的值。大概的意思如下:代码不完整,算是伪代码
var oldValue = '';

//input事件处理 如下
if(!/^[0-9]*$/.test(value)){
    input.value = oldValue;
} else {
    oldValue = value;
}

/^\d*$/g 以数字开头,以数字结尾,并且匹配一个或多个数字

如果你仅仅想输入[0-9]的数字

const input = document.querySelector('input');
const reg = /^\d*$/;
input.oninput = (e) => {
  const val = input.value;
  // 输入的不是数字则删除
  if (!reg.test(val)) {
    input.value = val.slice(0, -1)
  }
}
onKeypress="return(/[\d]/.test(String.fromCharCode(event.keyCode)))"

<input type="number" name="points" min="1" max="10" step="1"/>

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏