JavaScript正则如何排除指定连续字符组实现Discord ID格式校验
const discordIdRegex = /^(?:[^#'@]|'{1,2}|'{4,})+#\d{4}$/
正则逻辑说明
- 开头
^和结尾$锚定整个字符串,确保完整匹配,同时修复了你原有实现中开头第一个字符允许为#/@的疏漏,所有用户名部分的字符都会经过规则校验 - 第一部分(#之前的用户名部分)的匹配规则拆解:
[^#'@]:匹配所有不是#、@、'的合法字符'{1,2}:允许连续1-2个单引号'{4,}:允许连续4个及以上的单引号- 以上三个规则用非捕获组
(?:)包裹,用+限定至少出现1次,自动排除了恰好3个连续单引号的情况,同时不会拦截4个及以上的连续单引号
- 第二部分固定匹配
#字符 - 第三部分
\d{4}匹配恰好4位数字
匹配测试验证
| 测试字符串 | 匹配结果 | 符合预期 |
|---|---|---|
normal#1234 | 匹配 | 是 |
single'quote#5678 | 匹配 | 是 |
double''quote#5678 | 匹配 | 是 |
triple'''quote#5678 | 不匹配 | 是(恰好3个单引号被拦截) |
four''''quote#5678 | 匹配 | 是(4个单引号允许) |
six''''''quote#5678 | 匹配 | 是(6个单引号允许) |
has@at#9012 | 不匹配 | 是(包含@被拦截) |
has#hash#9012 | 不匹配 | 是(第一部分包含#被拦截) |
同类需求实现思路
以「允许@和#单独出现,但禁止@#连续组合」为例,核心逻辑是对禁止的连续组合添加否定前瞻判断:
// 禁止出现@#连续组合的正则 const demoRegex = /^(?:[^@]|@(?!#))+$/
逻辑为:要么匹配非@的字符,要么匹配后面没有紧跟#的@,即可实现允许单独@、单独#,拦截@#连续组合的需求。
内容的提问来源于stack exchange,提问作者Caliph Hamid
相关产品推荐
相关产品推荐

