正则表达式需求:匹配含连续短横线的数字串,排除ISO日期
解决思路:调整正则以排除合法ISO日期,匹配含连续短横线的格式
首先咱们明确核心需求:原正则[0-9-]{4}-[0-9-]{2}-[0-9-]{2}$需要排除标准ISO日期(比如1970-01-01),同时必须匹配**包含至少一组连续短横线(--)**的目标字符串,像1979------、--------29、-----11---这类都要命中。
方法一:纯正则实现(JavaScript兼容)
我们可以在原正则基础上,添加负向预查来排除合法ISO日期,同时确保字符串存在连续短横线:
/^(?!\d{4}-\d{2}-\d{2}$)([0-9-]{4}-[0-9-]{2}-[0-9-]{2})$/
正则拆解:
(?!\d{4}-\d{2}-\d{2}$):负向预查,直接排除整个字符串是四位数字-两位数字-两位数字的合法ISO日期格式([0-9-]{4}-[0-9-]{2}-[0-9-]{2}):保留原正则的结构,匹配符合4位(数字/短横线)-2位(数字/短横线)-2位(数字/短横线)的格式^和$:确保匹配的是整个字符串(原正则只有末尾的$,补开头的^会更严谨)
方法二:JavaScript结合字符串判断(更直观)
如果不需要纯正则方案,用JavaScript的字符串方法配合正则会更易懂,逻辑清晰:
function isValidTarget(str) { // 先验证原格式,再排除合法ISO日期,最后检查是否有连续短横线 const baseRegex = /^[0-9-]{4}-[0-9-]{2}-[0-9-]{2}$/; return baseRegex.test(str) && !/^\d{4}-\d{2}-\d{2}$/.test(str) && str.indexOf('--') !== -1; }
逻辑说明:
- 先用原正则校验字符串是否符合
xxxx-xx-xx的结构(x只能是数字或短横线) - 用
/^\d{4}-\d{2}-\d{2}$/过滤掉合法的ISO日期 - 用
str.indexOf('--') !== -1确保字符串里至少有一组连续短横线
测试用例验证
- 匹配成功的例子:
1979------✅--------29✅-----11---✅19--01-01✅
- 匹配失败的例子:
1970-01-01❌(合法ISO日期)1970-01-0❌(不符合原格式长度)1970-01-0a❌(包含非数字/短横线字符)
内容的提问来源于stack exchange,提问作者dagda1
相关产品推荐
相关产品推荐

