使用正则表达式为仅第二行有连字符的首行补全缺失连字符
字幕连字符补全的正则解决方案
需求明确:处理SRT字幕时,当同一段对话里只有第二行开头带连字符,要给第一行补上缺失的连字符。
原始字幕内容
167 00:06:59,794 --> 00:07:01,379 Well, I would like to see your face as soon as possible. 168 00:07:01,421 --> 00:07:03,048 Really? - If that's possible, yeah. 169 00:07:03,089 --> 00:07:04,007 - Really? - Mm-hmm. 170 00:07:04,049 --> 00:07:05,550 I wanna see your face. - Okay. 171 00:07:05,592 --> 00:07:07,427 Let's just order so we can get the business out of the way,
之前尝试的正则(存在匹配范围过大问题)
查找:
([A-Z][\S\s]+)(?=^-\B)
替换:
- $1\r\n-
这个正则的问题在于[\S\s]+会匹配任意字符(包括换行),导致匹配范围不受控,容易误改其他不需要处理的内容。
期望修正后的结果
167 00:06:59,794 --> 00:07:01,379 Well, I would like to see your face as soon as possible. 168 00:07:01,421 --> 00:07:03,048 - Really? - If that's possible, yeah. 169 00:07:03,089 --> 00:07:04,007 - Really? - Mm-hmm. 170 00:07:04,049 --> 00:07:05,550 - I wanna see your face. - Okay. 171 00:07:05,592 --> 00:07:07,427 Let's just order so we can get the business out of the way,
正确的正则表达式方案
需要开启多行模式(Multiline),这样^和$才能匹配每行的开头和结尾:
查找正则:
^(?!-)(.*)$\r?\n^-(.*)$
替换内容:
- $1\r\n- $2
逻辑说明
^(?!-)(.*)$:匹配不以连字符开头的整行内容,(?!-)是负向前瞻,确保行首不是-,(.*)捕获这行的所有内容到分组1。\r?\n:匹配Windows或Unix风格的换行符,兼容不同系统的字幕格式。^-(.*)$:匹配以连字符开头的整行内容,(.*)捕获连字符后面的内容到分组2。- 替换时,给第一行内容前加上
-,第二行保留原有的-并拼接捕获的内容,精准只修正符合条件的对话行。
内容的提问来源于stack exchange,提问作者Hank K
相关产品推荐
相关产品推荐

