JavaScript正则需求:匹配赛事进行分钟标记,排除比分与开赛时间
适配需求的正则实现方案
正则表达式
/(?<=^|\s|newLine)((?:[1-9]|[1-8][0-9]|90|120)(?:\+[1-9])?)(?=\s)/gm
规则说明
- 锚定匹配位置:通过后行断言限定,仅匹配前面为字符串开头、空白字符、或已插入的
newLine标记的内容,避免误匹配队名、比分中间嵌入的数字 - 限定匹配范围:
- 覆盖常规比赛分钟:1-9的个位数、10-89的两位数、90分钟
- 覆盖伤停补时:90+1至90+9的格式
- 覆盖加时赛分钟:120分钟、120+1至120+9的格式
- 排除无效数字:不会匹配100-119、121及以上不存在的赛事分钟标识
- 排除误匹配场景:
- 通过先行断言要求匹配内容后紧跟空白字符,直接排除带冒号的开赛时间(如
20:30数字后为冒号)、带横杠的赛事比分(如1-0数字后为横杠)
- 通过先行断言要求匹配内容后紧跟空白字符,直接排除带冒号的开赛时间(如
插入拆分标记的实现逻辑
将匹配到的分钟数替换为newLine加原分钟内容即可,示例:
// 以JavaScript为例,其他语言替换逻辑完全一致 const cleanedText = originalText.replace(/(?<=^|\s|newLine)((?:[1-9]|[1-8][0-9]|90|120)(?:\+[1-9])?)(?=\s)/gm, 'newLine$1');
误匹配测试验证
| 测试输入 | 是否匹配 | 原因 |
|---|---|---|
25 阿森纳 1-0 切尔西 | 是 | 25为常规比赛分钟,前后符合边界要求 |
90+3 巴萨 2-2 皇马 | 是 | 为伤停补时格式,前后符合边界要求 |
120 拜仁 0-0 多特 | 是 | 为加时赛结束标识,前后符合边界要求 |
20:30 曼联 vs 利物浦 | 否 | 数字后紧跟冒号,不满足后接空白的要求 |
曼联 1-0 利物浦 | 否 | 数字后紧跟横杠,不满足后接空白的要求 |
1860慕尼黑 2-0 纽伦堡 | 否 | 数字后紧跟其他数字,不满足后接空白的要求 |
注:该正则依赖正则引擎的零宽断言能力,当前主流的Node.js、Chrome等运行环境均已原生支持,若使用的环境不支持后行断言,可将边界条件改为捕获组整体匹配,替换时保留前置边界内容即可。
内容的提问来源于stack exchange,提问作者bokkie
相关产品推荐
相关产品推荐

