简化字幕歌词匹配正则表达式需求(含HTML斜体块场景)
简化字幕歌词匹配的正则表达式方案
需求背景
我有一套从视频分离字幕的工作流,会移除听障相关及冗余内容,仅保留台词部分。但字幕中常混入歌曲歌词,这类歌词几乎均以♪包裹1-3行文本,目前在BBEdit中使用多OR分支的正则匹配移除,现需要简化正则:
- 匹配以♪开头结尾、中间含任意行数文本的内容
- 匹配被HTML
<i>标签完整包裹的同格式歌词,替换现有多OR分支的方案
示例歌词格式
906 00:42:10,597 --> 00:42:12,530 ♪ When I woke up I opened my eyes♪ 907
原有正则问题
原有普通文本正则通过多个OR分支覆盖1-3行的情况,写法冗余:
♪ .+ .+ .+ ♪|♪ .+ .+ ♪|♪ .+ ♪|♪ .+
原有HTML斜体块正则同样存在冗余问题:
<i>♪ .+ .+ .+ ♪</i>|<i>♪ .+ .+ ♪</i>|<i>♪ .+ ♪</i>
简化后的正则方案
普通文本歌词匹配
使用非贪婪模式匹配任意内容(含换行),无需分分支覆盖行数:
♪[\s\S]*?♪
♪:匹配开头的音符标记[\s\S]*?:匹配任意字符(包括换行符),*?为非贪婪模式,确保只匹配到最近的结尾♪,避免跨多个歌词块匹配♪:匹配结尾的音符标记
HTML斜体包裹的歌词匹配
同理,在普通文本正则基础上加上<i>标签的匹配:
<i>♪[\s\S]*?♪</i>
<i>:匹配开头的斜体标签- 中间部分同普通文本正则,匹配完整歌词内容
</i>:匹配结尾的斜体标签
注:在BBEdit中使用时,默认正则引擎已支持多行匹配,该正则可覆盖1-3行甚至更多行的歌词场景,完全替代原有多OR分支的写法。
内容的提问来源于stack exchange,提问作者ArchonOSX
相关产品推荐
相关产品推荐

