字幕正则替换
或者粘贴字幕文本
选项
一条正则表达式,对每条字幕的文本进行匹配。所有匹配都会被替换。这一节的两个页面共用这个框:一个默认留空,供你填入已有的表达式;另一个预填一条可随意修改的表达式。
每个匹配被替换成的内容。留空则删除所有匹配。与字面查找替换页不同,这里的美元符号有特殊含义:$1 表示匹配中的第一个括号分组,$& 表示整个匹配,$$ 表示一个字面的美元符号。
编译表达式时使用的字母。默认开启 g 和 u:u 让表达式按字符而不是按码元读取文本,\p{L} 这类写法才名副其实。加 i 忽略大小写,加 m 让 ^ 和 $ 匹配每行首尾,加 s 让点号也能匹配换行。清空这个框则以无标志编译。任何其他字母都会被拒绝而不是忽略,因为在你不曾要求的标志下运行,表达式会悄悄地变成另一个意思。
时间按哪个帧率计算。在格式页面里,这是 MicroDVD 需要的值,因为它把时间存成帧号。在帧率页面里,它是文件当初对应的速率 —— 字幕是按这个版本做的 —— 而页面的第二个框填你要拿它配套的视频速率。常见的有 23.976、24、25、29.97、30、50、59.94 和 60。填错会让整条时间轴偏移;在帧率页面里,偏移是按比例发生的,而不是一个固定的量。
填写 正则表达式 后才能运行。
这一页用你写的模式重写字幕 cue 里的文字。模式不是固定字符串:`\d+` 表示任意一串数字,`(cat|dog)` 表示两个词中的任一个,一个点代表任意字符。每条 cue 里的每一处匹配都在一趟里被替换,页面报出改了多少处。只有文字移动,每条 cue 的起止时间原样带过去。
替换框也不是固定字符串。里面的美元符号有特殊含义:`$1` 代表匹配中第一个括号捕获的内容,`$&` 代表整个匹配,`$$` 代表一个字面的美元符号。正因如此,一条规则能整理上千行不同的文字——删掉句号前多出来的空格而保留标点,因为标点就是括号捕获到的内容。
模式默认带 `g` 和 `u` 运行。`g` 表示找出全部匹配而不只是第一个;`u` 让模式按字符而不是按码元读文本,`\p{L}` 能表示“一个字母”靠的就是它。加 `i` 忽略大小写,加 `m` 让锚点按行生效,加 `s` 让点能匹配换行。清空标志框则一个标志都不带。其它字母会让整次运行被拒绝而不是被忽略,因为在你没有要求的标志下运行的模式,已经悄悄变成另一个意思了。
只要有诚实的位置,行内样式就会被带着走:编辑发生在标签之外时标签平移,发生在标签之内时标签拉伸。匹配横跨标签边界时标记被丢弃并计入有损报告,因为另一种结果是斜体包住了错的词。文件不上传,每份按自己的格式写回,整季可以一次排队处理。
示例
用捕获组留住标点
输入
1
00:00:01,000 --> 00:00:02,000
We stopped , and waited .
2
00:00:03,000 --> 00:00:04,000
Right !
输出
1
00:00:01,000 --> 00:00:02,000
We stopped, and waited.
2
00:00:03,000 --> 00:00:04,000
Right!
模式是“一段空格加 . , ! ? 中的一个”,括号把标点变成第一个分组,`$1` 把它放回去。三处匹配、三处改动。字面查找根本表达不了这件事:它只能把一个固定串换成另一个固定串。
匹配跨过斜体范围的边界
输入
1
00:00:01,000 --> 00:00:04,000
<i>Hello there</i>, welcome aboard
输出
1
00:00:01,000 --> 00:00:04,000
Hello there. Welcome aboard
匹配从斜体内部开始、在斜体外部结束,标记覆盖的内容有一半没了,也就没有正确的落点。它被丢弃并计数,而不是留下来包着错的字母。
常见问题
怎么保留匹配到的一部分内容?
在模式里用括号把那部分括起来,在替换里写 `$1`(第二个分组是 `$2`,依此类推)。模式 `\s+([.,!?])` 配替换 `$1` 会删掉空格、留住标点;`$&` 是整个匹配,`$$` 是文字里真正想要的美元符号。
默认开启哪些正则标志?还能加哪些?
默认是 `g` 和 `u`:前者找全部匹配,后者让模式按字符读文本,`\p{L}`、`\p{N}` 才有意义。可以加 `i`(忽略大小写)、`m`(锚点按行)、`s`(点匹配换行);把框清空则一个都不带。其它字母一律拒绝整次运行。
这一页和普通查找替换有什么区别?
区别在你框里写的东西。查找替换按字面匹配,能出错的地方只有“找不到”;这一页跑的是一个程序,一趟能命中上千处并全部改写。所以这里的模式默认是空的、未知标志会被拒绝,两页也分开:那边没改是笔误,这边可能是模式悄悄表达了别的意思。
两个匹配重叠时怎么处理?
最左边的胜出,扫描从它之后继续,这是所有正则引擎的做法。所以 `aa` 对 `aaaa` 只找到两处而不是三处,替换后是 `bb`。以为有三处,说明模式在要求引擎做不到的事,早点知道比拿到文件后知道好。
会拦下跑得很慢的模式吗?
会拒绝一类:在已经有无限重复的分组上再加重复,例如 `(a+)+` 或 `(\d+)+`,这类模式足以让标签页卡死。另有三类不拦,需要自己避开:重复组内的两个重叠分支 `(a|a)+`、并排的多个重叠重复 `a*a*a*b`、以及巨大的计数 `(a{100}){100}`。
正则替换会动样式标签吗?
会按规则动:标签在编辑之外时平移,包含编辑时拉伸或收缩;匹配跨过标签边界时丢弃并计数。卡拉 OK 计时只要被匹配碰到就丢弃,因为逐字划分已经和词对不上了。
正则替换能作用在哪些字幕格式上?
12 种都可以。模式作用在每条 cue 的文字上,而 12 种格式都能读出这段文字,所以 SRT、WebVTT、带样式的 ASS、LRC 歌词与纯文本转录稿行为一致,各自按原格式写回;MicroDVD 的帧号按面板里的帧率处理。