如何修改正则实现2-40字符长度校验且禁止首尾空格
正则修改方案
需求对齐
原有规则:字符串长度为2~40字符,允许中间包含连续空格;新增约束:禁止匹配带前导(开头)、尾随(结尾)空格的输入。
具体实现
方案1:断言写法(直观适配原有代码结构)
适合现代JS运行环境(Node.js 10+、Chrome 62+、Safari 11.1+等),直接修改如下:
const texte = /^(?=\S).{2,40}(?<=\S)$/g
规则说明:
- 完全保留原有
.{2,40}的长度匹配逻辑,无需手动换算长度范围 (?=\S):正向先行断言,要求字符串开头第一个字符不为空白字符(涵盖空格、制表符、换行等),如果仅需排除普通半角空格,可替换为(?=[^ ])(?<=\S):正向后行断言,要求字符串结尾最后一个字符不为空白字符,仅排除半角空格的话同理替换为(?<=[^ ])- 中间的
.{2,40}允许包含任意连续空格,符合原有规则
方案2:首尾匹配写法(兼容旧环境)
如果需要兼容不支持ES2018后行断言的低版本环境(如旧版WebView、老版本Safari),使用以下写法:
const texte = /^[^\s].{0,38}[^\s]$/g
规则说明:
- 首尾各强制匹配1个非空白字符,中间匹配0~38个任意字符,总长度范围刚好为
2 ~ 40,完全符合长度要求 - 仅排除半角空格的话,把两处
[^\s]替换为[^ ]即可
冗余代码优化
原写法RegExp(/^.{2,40}$/, 'g')属于冗余实现:正则字面量本身可以直接追加g全局标记,不需要额外用RegExp构造函数包裹,只有需要动态拼接正则规则字符串时,才需要使用RegExp构造函数。
校验效果示例
可正常匹配的场景:
- 长度为2的非空格字符串:
ab、1@- 中间带连续空格的字符串:
hello world(首尾非空,中间双空格允许)- 长度刚好为40的合法字符串
无法匹配的场景:
- 带前导空格:
test、test- 带尾随空格:
test、test- 长度不足2:
a、单个空格- 长度超过40的字符串
内容的提问来源于stack exchange,提问作者Lokomass
相关产品推荐
相关产品推荐

