同一网站结构相似页面下正则表达式无法正确提取目标值的问题求助
问题原因
现有代码的第一个正则匹配逻辑存在两个缺陷,是导致部分球队过滤失效的核心原因:
- 直接在全页面匹配球队名字符串,若队名出现在导航、页面介绍等非球队列表区域,会导致匹配的起始位置提前,最终抓取范围包含了该位置之后的所有球队数据
- 没有对队名字符串做正则特殊字符转义,若队名包含
.、+、?、()等正则保留字符时,会出现匹配逻辑异常
修复方案
首先新增正则特殊字符转义逻辑,再修改第一个正则的匹配规则,精准锁定球队名称在赛事列表中的专属标签位置,保证只匹配正式球队区块的起始位置,修复后完整代码如下:
function PaginaDoJogo() { // 正则特殊字符转义工具函数 function escapeRegExp(str) { return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); } const sheet = SpreadsheetApp.getActive().getSheetByName('Lesionados e Suspensos'); const url = sheet.getRange('Menu L&S!H1').getValue(); const team = sheet.getRange('Menu L&S!H2').getValue(); const response = UrlFetchApp.fetch(url); const content = response.getContentText(); // 转义队名中的正则特殊字符,精准匹配球队区块起始位置 const escapedTeam = escapeRegExp(team); const re = new RegExp(`<h[2-4][^>]*>\\s*${escapedTeam}\\s*</h[2-4]>[\\s\\S]+?<!--Livestream call to action-->`); const match = content.match(re); if (!match) return; // 未匹配到对应球队时直接退出,避免报错 const regExp = /<div[\s\S]+?<span class="inj-player">(.+?)<\/span>[\s\S]+?<span class="inj-info">(.+?)<\/span>[\s\S]+?<span class="inj-return h-sm">(.+?)<\/span>[\s\S]+?<\/div>/g; const values = []; while ((r = regExp.exec(match[0])) !== null) { if (r[1] !== 'Name' && r[2] !== 'Away on International duty') { values.push([r[1], r[3]]); } } if (values.length > 0) { sheet.getRange(2, 1, values.length, 2).setValues(values); } }
适配说明
该方案可适配全站所有同类赛事页面:
- 正则转义逻辑兼容所有包含特殊字符的队名
- 标题标签匹配逻辑避免了导航、页内文本出现队名导致的匹配范围错位问题
- 新增了匹配失败的空值判断,避免未找到对应球队时脚本抛出异常
内容的提问来源于stack exchange,提问作者Digital Farmer
相关产品推荐
相关产品推荐

