如何用Regex处理双语字幕:移除英文文本保留中文内容
我明白你在调试正则处理双语字幕时的头疼——格式不一的行、混在中文里的英文和HTML标签确实容易卡壳。结合你提到的\p{Han}(注意是\p{Han}而不是{Han}哦)匹配中文的思路,我给你一套分步解决的方案,既能适配大多数格式,又能高效剔除不需要的内容:
第一步:先清理HTML标签(比如)
不管内容混得有多乱,先把所有HTML标签一次性清掉,避免干扰后续匹配。用这个全局替换:
- 查找:
<[^>]+> - 替换为空字符串
第二步:保留时间轴,提取中文内容
接下来分两种常见场景处理,覆盖绝大多数双语字幕格式:
场景1:时间轴后同一行混着英文和中文
比如:
00:00:01,000 --> 00:00:04,000 Hello 你好呀
用正则匹配时间轴,同时精准提取后面的中文部分:
- 查找:
(\d{2}:\d{2}:\d{2}[.,]\d{3} --> \d{2}:\d{2}:\d{2}[.,]\d{3})\s*(?:[^\u4e00-\u9fa5\u3000-\u303f\uff00-\uffef]+)([\u4e00-\u9fa5\u3000-\u303f\uff00-\uffef]+) - 替换:
$1\n$2
(解释:$1完整保留时间轴,$2提取中文汉字+中文标点,中间的英文、空格等非中文内容全部剔除)
场景2:时间轴后英文一行、中文一行
比如:
00:00:01,000 --> 00:00:04,000
Hello world
你好,世界
用这个正则匹配并保留时间轴+中文行:
- 查找:
(\d{2}:\d{2}:\d{2}[.,]\d{3} --> \d{2}:\d{2}:\d{2}[.,]\d{3})\n.*?\n([\u4e00-\u9fa5\u3000-\u303f\uff00-\uffef]+) - 替换:
$1\n$2
(解释:.*?是非贪婪匹配,避免跨字幕条目抓取内容)
第三步:处理边缘情况
如果有的行只有英文没有中文,或者格式特别混乱,可以再加一个全局替换删除无中文的冗余行:
- 查找:
^(?!\d{2}:\d{2}:\d{2}|$)[^\u4e00-\u9fa5]+$ - 替换为空字符串
(解释:匹配既不是时间轴也不是空行,且完全没有中文的行,直接删除)
额外提示
- 正则里的
\u4e00-\u9fa5是中文汉字范围,\u3000-\u303f和\uff00-\uffef覆盖了全角中文标点、符号,确保中文内容完整保留; - 如果你的正则引擎支持Unicode属性,用
\p{Han}代替\u4e00-\u9fa5更简洁,比如(\p{Han}+); - 针对ASS等特殊格式的字幕,时间轴的正则可能需要微调,但核心逻辑不变——先锁定时间轴格式,再精准提取中文。
内容的提问来源于stack exchange,提问作者Hasen
相关产品推荐
相关产品推荐

