求允许字母数字与单个连字符的正则表达式,屏蔽指定特殊字符
正则校验方案实现
需求回顾
- 允许输入:大小写字母、数字、单个连字符
-(禁止连续两个-) - 禁止输入:
~!#$%^&*()+/"':;{}[]|<>=–(注:–即连续两个-`)
正确正则方案
1. 整体内容合法性校验(用于表单提交验证)
这个正则确保整个输入内容完全符合规则,不包含非法字符,且连字符不会连续出现、不会在结尾:
^[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)*$
解释:
^和$锁定字符串首尾,确保整个内容都被校验[a-zA-Z0-9]+匹配至少一个字母或数字(避免输入为空或仅含连字符)(?:-[a-zA-Z0-9]+)*允许零个或多个「连字符+至少一个字母/数字」的组合,彻底杜绝连字符连续出现或单独存在的情况
如果业务允许输入首尾出现单个连字符,可调整为:
^-?[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)*-?$
2. 实时输入过滤(用于阻止非法字符输入)
如果需要在用户输入时实时过滤非法内容,使用以下正则匹配所有非法字符并替换为空:
[^a-zA-Z0-9-]|--
解释:
[^a-zA-Z0-9-]匹配所有非字母、非数字、非单个连字符的非法字符|--匹配连续两个连字符(对应需求中的–)- 全局匹配并替换为空即可实现实时过滤
原正则问题分析
你之前尝试的 ^[a-z ]+([-])[a-z ] 存在以下问题:
- 仅允许小写字母和空格,未包含数字、大写字母
- 强制要求输入必须包含且仅包含一个连字符,且位置固定在两组字符中间
- 未处理需求中禁止的特殊字符,也没有限制连续连字符的情况
代码示例(JavaScript)
表单校验示例
const isValidInput = (value) => { const regex = /^[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)*$/; return regex.test(value); }; // 调用示例 console.log(isValidInput("abc123")); // true console.log(isValidInput("abc-123")); // true console.log(isValidInput("abc--123")); // false console.log(isValidInput("abc!123")); // false
实时过滤示例
const input = document.getElementById("target-input"); input.addEventListener("input", (e) => { // 过滤非法字符和连续连字符 e.target.value = e.target.value.replace(/[^a-zA-Z0-9-]|--/g, ""); });
内容的提问来源于stack exchange,提问作者apoorv sharma
相关产品推荐
相关产品推荐

