You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言解析动漫影视标题集数报错的解决方案咨询

解决Go动漫解析应用中的集数提取与类型区分问题

问题背景

开发与动漫网站交互的Go应用时,需同时处理带编号的常规剧集与无编号的电影/OVA内容。解析如“One Piece Film: Z - Filme”这类标题时,因无预期集数编号,strconv.Atoi转换空字符串触发报错:

Error parsing episode number 'One Piece Film: Z - Filme': strconv.Atoi: parsing "": invalid syntax

原extractEpisodeNumber函数预期无数字时返回"1",但实际仍出现报错,需要优化逻辑以避免转换错误,并精准区分内容类型。

优化思路

核心解决两点:

  • 确保集数返回值始终合法:无论标题是否含数字,都返回可直接使用的整数,彻底消除strconv.Atoi转换报错
  • 精准识别内容类型:通过关键词(如Film/OVA/剧场版等)区分电影/OVA与常规剧集,避免仅依赖数字存在性的误判

优化后代码实现

package main

import (
	"fmt"
	"regexp"
	"strconv"
)

// extractEpisodeInfo 返回集数和是否为电影/OVA的标识
func extractEpisodeInfo(title string) (int, bool) {
	// 匹配电影/OVA相关关键词(不区分大小写,支持英文、中文关键词)
	movieOVAKeywords := regexp.MustCompile(`(?i)(film|ova|movie|special|剧场版|SP)`)
	isMovieOVA := movieOVAKeywords.MatchString(title)
	if isMovieOVA {
		return 1, true
	}

	// 优先匹配常规剧集标识(Episode/EP/Ep等)后的数字,避免误提取年份等无关数字
	episodeMarkerRegex := regexp.MustCompile(`(?i)(episode|ep)\s*(\d+)`)
	matchGroups := episodeMarkerRegex.FindStringSubmatch(title)
	if len(matchGroups) >= 3 {
		num, _ := strconv.Atoi(matchGroups[2])
		return num, false
	}

	// 兜底:提取标题中第一个连续数字作为集数
	numRegex := regexp.MustCompile(`\d+`)
	numStr := numRegex.FindString(title)
	if numStr != "" {
		num, _ := strconv.Atoi(numStr)
		return num, false
	}

	// 极端情况:无数字且无电影标识,默认返回1并标记为电影/OVA
	return 1, true
}

func main() {
	testTitles := []string{
		"One Piece Episode 1",
		"One Piece Film: Z - Filme",
		"Attack on Titan EP 25",
		"Naruto Shippuden Special: The Day Naruto Became Hokage",
		"BLEACH 剧场版:地狱篇",
		"Demon Slayer 2024 Episode 12",
		"Fullmetal Alchemist Brotherhood", // 无数字无标识的极端情况
	}

	for _, title := range testTitles {
		epNum, isMovie := extractEpisodeInfo(title)
		contentType := "常规剧集"
		if isMovie {
			contentType = "电影/OVA"
		}
		fmt.Printf("标题:'%s' → 类型:%s,集数:%d\n", title, contentType, epNum)
	}
}

代码说明

  1. 类型识别:通过正则匹配不区分大小写的多语言关键词,精准标记电影/OVA内容,避免仅靠数字存在性的误判
  2. 集数提取优先级:
    • 优先匹配Episode/EP等标识后的数字,避免提取标题中的年份、作品编号等无关信息
    • 无剧集标识时,提取标题中第一个连续数字作为集数
    • 极端场景(无数字无标识)默认返回1并标记为电影/OVA,确保返回值始终合法
  3. 错误规避:直接返回整数类型的集数,无需再调用strconv.Atoi,彻底消除转换报错风险

运行结果

标题:'One Piece Episode 1' → 类型:常规剧集,集数:1
标题:'One Piece Film: Z - Filme' → 类型:电影/OVA,集数:1
标题:'Attack on Titan EP 25' → 类型:常规剧集,集数:25
标题:'Naruto Shippuden Special: The Day Naruto Became Hokage' → 类型:电影/OVA,集数:1
标题:'BLEACH 剧场版:地狱篇' → 类型:电影/OVA,集数:1
标题:'Demon Slayer 2024 Episode 12' → 类型:常规剧集,集数:12
标题:'Fullmetal Alchemist Brotherhood' → 类型:电影/OVA,集数:1

内容的提问来源于stack exchange,提问作者killerbyte

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 14:10:20