GAS爬取场景下拆分同字符串内英日配音演员姓名的实现方法
GAS爬取FEH英雄数据的VA姓名拆分方案
问题描述
使用Google Apps Script(GAS)爬取火焰纹章英雄(Fire Emblem Heroes)GamePress站点数据、写入谷歌电子表格时,英文、日文配音演员姓名共同存储在HTML属性data-va中,姓名字数、格式无统一规则:
- 部分英文名带中间名缩写点(如
Joe J. Thomas) - 部分英文名是3段结构(如
Cassandra Lee Morris)
原有拆分逻辑仅能适配带缩写点的2段英文名,3段式姓名需要单独硬编码边界case,可维护性差;尝试爬取页面内姓名标签做匹配校验未达预期。
待拆分字符串样例及预期拆分结果:
- 样例a:
Julie Kliewer Uchida Maaya (内田真礼)→ 英文名Julie Kliewer,日文名Uchida Maaya (内田真礼) - 样例b:
Joe J. Thomas Suzuki Tatsuhisa (鈴木達央)→ 英文名Joe J. Thomas,日文名Suzuki Tatsuhisa (鈴木達央) - 样例c:
Cassandra Lee Morris Fujiwara Natsumi (藤原夏海)→ 英文名Cassandra Lee Morris,日文名Fujiwara Natsumi (藤原夏海)
实现思路
观察所有data-va属性值的固定结构规律,不需要从前往后判断英文名长度,从后往前定位分割边界即可覆盖所有格式:
- 所有日文名末尾都带半角括号包裹的日文汉字名,左括号
(是稳定的定位标记 - 括号前的日文罗马音固定为「日文姓 日文明」两段结构,仅含1个空格
- 从左括号位置向前遍历,找到第二个空格的位置,就是英文名和日文名的分割点——分割点前所有内容为英文名(无论2段、带缩写、3段结构都完整保留),分割点后所有内容为完整日文名(含罗马音和括号内汉字名)
替换代码
将原有代码中拆分VA的逻辑段(从let index = vas[i].includes(".")到针对Cassandra Lee的硬编码判断块)全部替换为以下代码即可:
// 自动拆分英/日配音姓名,无需硬编码特殊case const vaRaw = vas[i].trim(); // 定位日文汉字名的左括号起始位置 const bracketPos = vaRaw.indexOf('('); // 提取括号前的罗马音段落 const romajiSeg = vaRaw.slice(0, bracketPos).trim(); // 定位罗马音段内的最后一个空格(日文明前),再往前找一个空格就是英日姓名分界 const lastSpacePos = romajiSeg.lastIndexOf(' '); const splitPos = romajiSeg.lastIndexOf(' ', lastSpacePos - 1); // 提取拆分结果 const en_va = vaRaw.slice(0, splitPos).trim(); const jp_va = vaRaw.slice(splitPos + 1).trim();
适配说明
- 自动适配2段常规英文名、带中间名缩写的英文名、3段结构英文名,不需要单独写边界判断
- 原有针对
Cassandra Lee Morris的硬编码修正逻辑可以直接删除,新逻辑会自动识别该类姓名 - 只要站点保持「英文名 + 日文罗马音(姓+名) + (日文汉字名)」的存储格式,后续新增英雄不需要调整拆分逻辑
内容的提问来源于stack exchange,提问作者Nitram
相关产品推荐
相关产品推荐

