JavaScript正则显式设置匹配7次却匹配到更少次数如何解决
问题原因
你原来的正则存在两个核心问题:
- 片段之间的分隔符
\s??是惰性可选的,没有强制要求片段之间必须用空格分割,正则引擎会自动把单个符合规则的片段(比如0/2)拆成0、/、2多个独立分组,来凑够{7}的匹配次数,导致不足7个片段的字符串也能被匹配。 - 没有限定分组的匹配边界,导致分组可以拆分单个有效片段。
解决方案
直接使用以下正则即可满足需求:
// 正则字面量写法 const regex = /^[0-9*\/]+(?: [0-9*\/]+){6}$/
如果用RegExp构造函数可以写为:
const regex = new RegExp(String.raw`^[0-9*/]+(?: [0-9*/]+){6}$`)
正则说明
- 第一个
[0-9*/]+匹配第一个有效片段(由数字、*、/组成的非空字符串) (?: [0-9*/]+){6}是非捕获组,匹配后续6个「空格+有效片段」的组合,加上第一个正好凑够7个片段- 开头
^和结尾$确保整个字符串完全匹配,不会出现部分匹配的情况
如果需要支持片段之间存在多个空格、制表符等空白字符,可将组内的单个空格替换为
\s+,对应正则为/^[0-9*\/]+(?:\s+[0-9*\/]+){6}$/
匹配测试结果
* * 0/2 * *→ 不匹配(仅5个片段,符合预期)* * * * * * *→ 匹配(7个片段,符合预期)* 0/2 * * * 2 *→ 匹配(7个片段,符合预期)* 0/2 0/2→ 不匹配(仅3个片段,符合预期)
内容的提问来源于stack exchange,提问作者JTinkers
相关产品推荐
相关产品推荐

