如何改进基于indexOf提取子串的方法,避免硬编码偏移量导致提取错误
优化实现方案
以下是两种可替代硬编码偏移的可靠方案,优先推荐第二种:
方案1:正则匹配提取(无需硬编码偏移)
直接匹配timestamp字段后跟随的标准时间格式内容,不需要计算任何位置偏移:
// 匹配规则:匹配timestamp字段后双引号包裹的标准时间内容 const timeReg = /"timestamp":"(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})"/; const matchResult = TextScript.match(timeReg); if (matchResult) { const targetTime = matchResult[1]; sheet.getRange(1, 1).setValue(targetTime); }
该方案只要timestamp字段名和时间格式不变,就不会出错,容错率远高于硬编码偏移。
方案2:提取JSON结构解析(最稳定,优先选择)
你采集到的脚本内容里,HomeMatchesBlock的第三个入参是标准JSON格式,直接提取这段JSON解析后读取属性即可,完全规避位置偏移问题,即使后续其他字段增减、位置变化,只要timestamp字段还在这个JSON结构里就不会出错。
优化后完整代码如下:
function Clock() { var sheet = SpreadsheetApp.getActive().getSheetByName('Clock'); var url = 'https://int.soccerway.com/'; const contentText = UrlFetchApp.fetch(url).getContentText(); const $ = Cheerio.load(contentText); const Before = '"timestamp":"'; var ElementSelect = $('script:contains(' + Before + ')'); var TextScript = ElementSelect.html(); // 提取HomeMatchesBlock的第三个参数JSON段 const jsonReg = /new HomeMatchesBlock\([^,]+,[^,]+,(\{.*?\})\)/; const jsonMatch = TextScript.match(jsonReg); if (jsonMatch) { const config = JSON.parse(jsonMatch[1]); const targetTime = config.timestamp; sheet.getRange(1, 1).setValue(targetTime); } }
内容的提问来源于stack exchange,提问作者Digital Farmer
相关产品推荐
相关产品推荐

