跳至主要內容
SubtitleMatrix

字幕正規表達式取代

文字樣式正規表達式取代
或者貼上字幕文字

選項

一條正規表達式,對每條字幕的文字進行比對。所有符合項目都會被取代。這一節的兩個頁面共用這個欄位:一個預設留空,供你填入既有的表達式;另一個預填一條可自由修改的表達式。

每個符合項目被取代成的內容。留空則刪除所有符合項目。與字面尋找取代頁不同,這裡的美元符號有特殊意義:$1 表示符合項目中的第一個括號分組,$& 表示整個符合項目,$$ 表示一個字面的美元符號。

編譯表達式時使用的字母。預設開啟 g 和 u:u 讓表達式按字元而不是按碼元讀取文字,\p{L} 這類寫法才名副其實。加上 i 忽略大小寫,加上 m 讓 ^ 和 $ 符合每行首尾,加上 s 讓點號也能符合換行。清空這個欄位則以無旗標編譯。任何其他字母都會被拒絕而不是忽略,因為在你不曾要求的旗標下執行,表達式會悄悄地變成另一個意思。

時間以哪個影格率計算。在格式頁面上,這是 MicroDVD 需要的值,因為它把時間存成影格編號。在影格率頁面上,它是檔案當初對應的速率 —— 字幕是照這個版本製作的 —— 而頁面的第二個欄位填你要搭配的影片速率。常見的有 23.976、24、25、29.97、30、50、59.94 和 60。填錯會讓整條時間軸位移;在影格率頁面上,位移是按比例發生,而不是固定的量。

填寫 表達式 後才能執行。

這一頁用你寫的樣式改寫字幕裡的文字。樣式不是固定字串:`\d+` 代表任意一串數字,`(cat|dog)` 代表這兩個詞之一,句點代表任何一個字元。每一條字幕裡的每一處命中都會在同一輪被取代,而頁面會回報改了幾個地方。只有文字會移動——每個起止時間都原樣帶過去。

取代框也不是固定字串。裡面的錢字號有特別意思:`$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` 能把它放回去。三處命中、三處改動。字面搜尋根本表達不了這件事:它只能把一個固定字串變成另一個固定字串。

一條樣式,兩種拼法

輸入

The Colour of the sky.
colourless and calm.

輸出

The color of the sky.
colorless and calm.

旗標框裡有 `i`,所以 `colour` 連大寫的拼法也抓得到。注意這個旗標沒有做的事:行首那個大寫不見了,因為樣式不知道一個詞在句子裡的角色。如果大小寫有意義,那是第二條規則。

命中跨過一段斜體的邊界

輸入

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`。`g` 找出每一處而不是在第一處就停;`u` 讓樣式逐字元讀文字,`\p{L}`、`\p{N}` 這些才真的有意義。加上 `i` 忽略大小寫、`m` 讓錨點逐行生效、`s` 讓句點能比對換行。清空框就完全不帶旗標。其他任何字母——`x`、`y`、`d`——都會讓執行被拒絕,而不是被忽略。

這一頁跟尋找取代那頁一樣嗎?

不一樣,差別在框裡打的是什麼。那頁按字面比對字元,唯一會出錯的就是找不到東西。這一頁跑的是一支程式,一輪就能命中幾千處並全部改寫。所以這裡的樣式一開始是空的、未知旗標會被拒絕、兩頁也分開:在一頁,沒發生的改寫是打錯字;在另一頁,那可能是一個悄悄表達別的意思的樣式。

兩處命中重疊時會怎樣?

最左邊的那個勝出,掃描從它之後繼續,這是每個正規表達式引擎的做法。所以 `aa` 對上 `aaaa` 會找到兩處而不是三處,取代之後文字是 `bb`。如果你期待三處,那個樣式在描述引擎做不到的事,而最好在檔案回來之前就知道。

頁面會保護我免於很慢的樣式嗎?

它會在執行前拒絕其中一族:對已經沒有上限地重複的群組再加一次重複,例如 `(a+)+` 或 `(\d+)+`。那是會鎖住瀏覽器分頁的樣式,三十個字元的輸入就夠了。有三種形狀抓不到,值得自己避開——重複群組裡兩個互相重疊的選項,例如 `(a|a)+`;好幾個重疊的重複並排,例如 `a*a*a*b`;以及巨大的次數,例如 `(a{100}){100}`。沒有任何東西按時鐘檢查,因為時間上限會讓同一份檔案在快機器與慢機器上產出不同的結果。

文字被改寫時,斜體與其他樣式會怎樣?

改動之外的標籤跟著文字位移,包住改動的標籤會拉長或縮短。命中跨過標籤邊界時,標記已經沒有正確的位置可放,所以被拿掉,而報告會說有幾個被拿掉。卡拉 OK 計時只要被命中碰到就會被丟掉,因為逐音節的切分已經對不上詞了。

這一頁可以用在任何字幕格式上嗎?

可以。樣式套用在每條字幕的文字上,而 12 種格式都會讀出那段文字,所以 SRT、WebVTT、帶樣式的 ASS、LRC 歌詞表或純文字轉錄稿的運作方式都一樣。每份檔案按進來的格式寫回,而 MicroDVD 的影格號使用面板上的影格率。

相關工具