js 正则表达式禁止输入框输入特殊字符遇到的坑以及解决方案

前言


最近在项目中有一个需求是禁止输入特殊字符,一开始我是在网上找的正则表达式直接用的,后来发现这个表达式同时也禁止了v,x,y,z,所以后来就想了一个比较笨的方法,把所有的特殊字符全部罗列出来,然后在匹配一下。最后在输入的时候禁止就好了。

项目都是在vue中的,所有方法都是在methods里边的。

step 一, 正则表达式解决方案

用这种方式替换,会导致v,x,y,z输入不进去,亲测。

    <el-input
          placeholder="I'm shopping for..."
          v-model="searchVal"
          id="right_radius_set"
          @keyup.native="prohibit_input"
          @keyup.enter.native="toSearch"
        >
          <a slot="suffix" @click="toSearch">
            <i class
<think>根据用户需求,我们需要解决两个问题:1.在Vue中设置rules规则,确保四个输入框的内容不能相同,并实时提示。2.提供用于验证正数的正则表达式。结合引用内容,我们可以这样实现:###一、四个输入框内容不同的验证规则(使用ElementPlus为例)思路:为每个字段设置自定义验证器,在验证器中检查当前值是否与其他三个字段的值重复。```html<template><el-form:model="form":rules="rules"ref="formRef"><!--四个输入框--><el-form-itemlabel="字段1"prop="field1"><el-inputv-model="form.field1"/></el-form-item><el-form-itemlabel="字段2"prop="field2"><el-inputv-model="form.field2"/></el-form-item><el-form-itemlabel="字段3"prop="field3"><el-inputv-model="form.field3"/></el-form-item><el-form-itemlabel="字段4"prop="field4"><el-inputv-model="form.field4"/></el-form-item></el-form></template><scriptsetup>import{reactive,ref}from'vue';constformRef=ref(null);constform=reactive({field1:'',field2:'',field3:'',field4:''});//自定义验证函数:检查值是否唯一(排除自身)constcheckUnique=(value,excludeField)=>{//获取其他字段的值(排除当前字段)constotherValues=Object.entries(form).filter(([key])=>key!==excludeField).map(([,val])=>val);//检查当前值是否在其他字段中出现return!otherValues.includes(value);};//通用验证规则生成器(为每个字段生成相同的验证逻辑)constcreateUniqueRule=(fieldName)=>{return[{required:true,message:'不能为空',trigger:['blur','change']},{validator:(_,value,callback)=>{if(value===''){callback(newError('不能为空'));return;}//检查唯一性if(!checkUnique(value,fieldName)){callback(newError('值不能重复'));}else{callback();}},trigger:['input','blur']//输入时实时验证}];};construles=reactive({field1:createUniqueRule('field1'),field2:createUniqueRule('field2'),field3:createUniqueRule('field3'),field4:createUniqueRule('field4')});</script>```###二、正数的正则表达式根据引用[1]和[3],我们可以使用以下正则表达式:-**正整数**:`/^[1-9]\d*$/`(不允许前导零,但允许0?注意:正整数通常不包括0)-**非负整数(包含0)**:`/^\d+$/`-**正浮点数(保留两位小数)**:`/^(([1-9]\d*)|0)(\.\d{1,2})?$/`(允许整数或最多两位小数)如果用户需要正整数(不包含0),则使用:`/^[1-9]\d*$/`如果用户需要正整数(包含0),则使用:`/^(0|[1-9]\d*)$/`###三、在验证规则中同时使用唯一性验证和正数验证我们可以修改上面的`createUniqueRule`函数,加入正数验证(以正整数为例):```javascriptconstcreateUniqueRule=(fieldName)=>{return[{required:true,message:'不能为空',trigger:['blur','change']},//正数验证(正整数){pattern:/^[1-9]\d*$/,message:'必须为正整数',trigger:['input','blur']},{validator:(_,value,callback)=>{//检查唯一性if(!checkUnique(value,fieldName)){callback(newError('值不能重复'));}else{callback();}},trigger:['input','blur']}];};```###注意事项1.**实时验证性能**:由于每次输入都会检查所有字段,如果字段很多可能会影响性能,但四个字段通常没问题。2.**空值处理**:在唯一性检查中,我们排除了空值(因为空值会由required规则处理),避免多个空值触发重复错误。3.**输入框类型**:如果希望限制只能输入数字,可以考虑使用`type="number"`,但注意要屏蔽`+`、`-`、`e`等字符(如引用[2]所示)。4.**错误提示顺序**:规则数组中的顺序决定了验证顺序,先验证必填,再验证格式,最后验证唯一性。###完整示例(结合正数验证和唯一性验证)```html<template><el-form:model="form":rules="rules"ref="formRef"><!--四个输入框--></el-form></template><scriptsetup>import{reactive,ref}from'vue';constformRef=ref(null);constform=reactive({field1:'',field2:'',field3:'',field4:''});//检查唯一性(排除当前字段)constcheckUnique=(value,excludeField)=>{if(value==='')returntrue;//空值不参与唯一性检查(由required处理)constotherValues=Object.entries(form).filter(([key])=>key!==excludeField).map(([,val])=>val);return!otherValues.includes(value);};constcreateUniqueRule=(fieldName)=>{return[{required:true,message:'不能为空',trigger:['blur','change']},//正整数验证{pattern:/^[1-9]\d*$/,message:'必须为正整数',trigger:['input','blur']},//唯一性验证{validator:(_,value,callback)=>{if(!checkUnique(value,fieldName)){callback(newError('值不能重复'));}else{callback();}},trigger:['input','blur']}];};construles=reactive({field1:createUniqueRule('field1'),field2:createUniqueRule('field2'),field3:createUniqueRule('field3'),field4:createUniqueRule('field4')});</script>```这样,四个输入框都要求:1.必填2.必须是正整数3.四个值互不相同且在输入时就会实时提示。[^1]:引用[1]提供了限制正整数的正则表达式。[^2]:引用[2]提到当输入框类型为number时需要屏蔽一些字符。[^3]:引用[3]展示了如何限制小数位数。[^4]:引用[4]提供了在ElementPlus中使用正则表达式进行表单验证的例子。[^5]:引用[5]提到了在AntDesignVue中获取输入值的方法。§§相关问题§§1.Vue中如何实现表单字段的联动验证?2.如何在Vue表单验证中优化大量字段的唯一性检查性能?3.ElementPlus表单验证规则中trigger事件的选择有哪些注意事项?</think>### Vue 中实现四个输入框内容唯一性验证的完整解决方案 #### 一、核心实现代码 ```html <template> <el-form :model="form" :rules="rules" ref="formRef"> <el-form-item label="字段1" prop="field1"> <el-input v-model="form.field1" placeholder="请输入正整数" /> </el-form-item> <el-form-item label="字段2" prop="field2"> <el-input v-model="form.field2" placeholder="请输入正整数" /> </el-form-item> <el-form-item label="字段3" prop="field3"> <el-input v-model="form.field3" placeholder="请输入正整数" /> </el-form-item> <el-form-item label="字段4" prop="field4"> <el-input v-model="form.field4" placeholder="请输入正整数" /> </el-form-item> </el-form> </template> <script setup> import { reactive, ref } from 'vue'; // 表单数据 const formRef = ref(null); const form = reactive({ field1: '', field2: '', field3: '', field4: '' }); // 正整数正则表达式 (引用[1]和[4]的优化) const positiveIntegerPattern = /^[1-9]\d*$/; // 禁止前导零的正整数 // 唯一性验证函数 const checkUnique = (currentValue, currentField) => { const otherValues = Object.entries(form) .filter(([key]) => key !== currentField) .map(([, val]) => val); return !otherValues.includes(currentValue); }; // 动态生成规则函数 const createFieldRules = (fieldName) => [ // 必填规则 { required: true, message: '不能为空', trigger: ['blur', 'change'] }, // 正整数规则 (引用[1]) { pattern: positiveIntegerPattern, message: '必须为正整数', trigger: ['input', 'blur'] }, // 唯一性规则 (实时验证) { validator: (_, value, callback) => { if (value && !checkUnique(value, fieldName)) { callback(new Error('值不能重复')); } else { callback(); } }, trigger: ['input', 'blur'] // 输入时实时验证 } ]; // 表单验证规则 const rules = reactive({ field1: createFieldRules('field1'), field2: createFieldRules('field2'), field3: createFieldRules('field3'), field4: createFieldRules('field4') }); </script> ``` #### 二、关键实现说明 1. **正整数验证正则表达式**: ```javascript const positiveIntegerPattern = /^[1-9]\d*$/; ``` - 匹配规则:以1-9开头,后跟任意数字 - 排除:0、负数、小数、科学计数法(e/E) - 符合引用[1]和[4]的正则要求 2. **唯一性验证逻辑**: ```javascript const checkUnique = (currentValue, currentField) => { // 获取其他三个字段的值 const otherValues = Object.entries(form) .filter(([key]) => key !== currentField) .map(([, val]) => val); return !otherValues.includes(currentValue); }; ``` 3. **实时验证触发**: ```javascript trigger: ['input', 'blur'] // 输入时立即触发验证 ``` 4. **动态规则生成**: ```javascript const createFieldRules = (fieldName) => [ ... ] ``` - 为每个字段自动生成包含必填、正数和唯一性验证的规则集 #### 三、功能特点 1. **实时反馈**: - 输入时立即提示重复错误 - 修改任一字段会触发其他字段的重新验证 2. **多重验证**: - 先验证非空 - 再验证正整数格式 - 最后验证唯一性 3. **错误提示**: - 未填写:"不能为空" - 格式错误:"必须为正整数" - 重复值:"值不能重复" #### 四、补充优化 如果需要防止用户输入非法字符(如:+ - e),可添加键盘事件(引用[2]): ```html <el-input v-model="form.field1" @keydown="limitInputValue" /> ``` ```javascript // 限制非法字符输入 const limitInputValue = (e) => { if (['e', 'E', '+', '-'].includes(e.key)) { e.preventDefault(); } }; ``` [^1]: 引用正则表达式限制正整数输入 [^2]: 引用屏蔽非法字符输入的方法 [^4]: 引用Element Plus表单验证规则实现方式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值