密码输入框正则需求:允许中间空格及特殊字符,禁止首尾空格
解决密码首尾无空格、允许中间空格及特殊字符的正则方案
我懂你要的需求了——密码里随便用特殊字符、中间插空格都没问题,但首尾绝对不能有空格对吧?之前试的\S太严格,又搞不定首尾空格的取反,给你个靠谱的正则方案:
核心正则表达式
const passwordValidator = /^(?!\s).*(?<!\s)$/;
拆解每个部分的作用
^:锚定字符串的起始位置(?!\s):正向预查,确保第一个字符不是空格(也就是开头不能以空格开头).*:匹配任意数量的任意字符(包括中间的空格、各种特殊符号,比如!@#$%^&*()这些都没问题)(?<!\s):反向预查,确保最后一个字符不是空格(也就是结尾不能以空格收尾)$:锚定字符串的结束位置
测试用例验证
直接在JS里测试几个典型场景,看看效果:
// 符合要求的情况 console.log(passwordValidator.test("MyPass123!@#")); // true(常规密码) console.log(passwordValidator.test("My Pass 123!@#")); // true(中间含空格) console.log(passwordValidator.test("a")); // true(单个非空格字符) // 不符合要求的情况 console.log(passwordValidator.test(" MyPass123!@#")); // false(开头空格) console.log(passwordValidator.test("MyPass123!@# ")); // false(结尾空格) console.log(passwordValidator.test(" ")); // false(纯空格) console.log(passwordValidator.test(" ")); // false(全是空格)
补充:如果需要限制密码长度
比如要求密码至少6位、最多20位,可以修改正则为:
const passwordValidatorWithLength = /^(?!\s).{5,19}(?<!\s)$/;
这里.{5,19}表示匹配5到19个任意字符,加上首尾的非空格要求,整体长度就是6到20位。
为啥你之前的尝试没成功?
- 用
\S的话,^\S+$会强制所有字符都是非空格,直接把中间的空格也禁止了,不符合需求; - 你试的
\A\s|\s*\Z在JS里不适用(JS正则没有\A/\Z,用^/$代替),而且直接匹配空格再取反的思路不对,应该用预查来排除首尾出现空格的情况,而不是反过来匹配空格。
内容的提问来源于stack exchange,提问作者Sri
相关产品推荐
相关产品推荐

