如何用正则表达式移除时间码间单行开头的连字符?
移除SRT字幕中时间码下单行文本的开头连字符
需求明确:只移除SRT字幕里时间码对应区间内仅单行存在的文本开头连字符(比如示例中编号24的情况),多行对话的开头连字符保留不动。
示例输入
19 00:07:03,089 --> 00:07:04,007 - Really? - Mm-hmm. 24 00:03:01,848 --> 00:03:04,893 - How adorable. 48 00:02:53,798 --> 00:02:54,758 [clears throat] 49 00:02:57,552 --> 00:02:59,971 - [clears throat] Phil. - What can I get you?
你之前尝试的正则没命中核心场景,原正则:
Find: ^(- )(?=.*\r?\n([A-Za-z\[])) Replace: - $1
问题在于它没定位到「时间码下仅单行」这个关键条件,反而错误试图保留连字符,逻辑方向不对。
正确正则解决方案
查找正则(兼容Windows/Linux换行)
(?<=^\d+\r?\n\d{2}:\d{2}:\d{2},\d{3} --> \d{2}:\d{2}:\d{2},\d{3}\r?\n)^- (.+)(?=\r?\n\r?\n|\Z)
替换内容
$1
正则逻辑说明
- 前置匹配:
(?<=^\d+\r?\n\d{2}:\d{2}:\d{2},\d{3} --> \d{2}:\d{2}:\d{2},\d{3}\r?\n)确保目标行前面是标准SRT的「编号+时间码」结构 - 目标捕获:
^- (.+)精准匹配以-开头的单行文本,把有效内容存到分组1 - 后置校验:
(?=\r?\n\r?\n|\Z)确保目标行后面是空行(分隔不同字幕条目)或文本结尾,证明这是该时间码下的唯一一行文本
执行后输出
19 00:07:03,089 --> 00:07:04,007 - Really? - Mm-hmm. 24 00:03:01,848 --> 00:03:04,893 How adorable. <<<<<<---- hyphen removed 48 00:02:53,798 --> 00:02:54,758 [clears throat] 49 00:02:57,552 --> 00:02:59,971 - [clears throat] Phil. - What can I get you?
内容的提问来源于stack exchange,提问作者Hank K
相关产品推荐
相关产品推荐

