如何编写匹配恰好3个连续相同数字的正则表达式?
解决正则匹配恰好连续3个空格分隔相同数字的问题
你当前的正则 /.*(\d+) \1 \1(?!(\s\1))/ 失效的核心原因是:.* 会匹配任意前置内容,当存在4个连续相同数字时,正则可以跳过第一个数字,匹配后面的三个,此时这三个数字的后面没有更多相同数字,负向断言 (?!(\s\1)) 会通过,导致整体匹配返回true。
要实现“仅匹配存在连续3个空格分隔的相同数字,且不存在连续4个或更多相同数字”的需求,可以使用组合负向先行断言的正则,先排除存在4个连续相同数字的情况,再匹配存在3个连续相同数字的情况:
const regex = /^(?!.*(\d+)(?: \1){3}).*(\d+)(?: \2){2}.*$/;
正则解释
^:匹配字符串开头(?!.*(\d+)(?: \1){3}):负向先行断言,确保字符串中不存在“一个数字序列 + 三次重复的空格+该数字序列”(即连续4个相同数字).*(\d+)(?: \2){2}.*:匹配字符串中存在“一个数字序列 + 两次重复的空格+该数字序列”(即连续3个相同数字)$:匹配字符串结尾
测试验证
// 测试用例 console.log(regex.test('I am 42 42 4 hey yoo')); // false → 正确 console.log(regex.test('I am 42 42 42 hey yoo')); // true → 正确 console.log(regex.test('I am 42 42 42 4 hey yoo')); // true → 正确 console.log(regex.test('I am 42 42 42 42 hey yoo')); // false → 正确 console.log(regex.test('42 42 42 42 43')); // false → 正确(存在4个连续42) console.log(regex.test('123 123 123')); // true → 正确(仅3个连续)
内容的提问来源于stack exchange,提问作者Rol Co
相关产品推荐
相关产品推荐

