2020年3月29日 星期日

利用正規表示式刪除字串中的字元

我有一個字幕檔,它的格式錯了,在逗號與數字之間多了一個空白:

00:00:00, 256 --> 00:00:01, 280

正確格式中間是沒有空白的:

00:00:00,256 --> 00:00:01,280

所以我在 Notepad++ 中嘗試使用正規表示式來搜尋、取代,但我祇會搜尋:

\d{2}, \d{3}

卻不知道要怎麼刪除中間的那一個空白。在 FB 上經過多位好友教導後,終於知道怎麼解決這個問題了。

將字串拆解為數個部份

怎麼做呢?首先,將要搜尋的字串拆成三段,前後是我們要保留的部份,中間那一段是我們要刪除的:

原本的字串:00:00:00, 256

第一段,逗號與前面的幾個字元『:00,』
第二段,就是那個空白字元
第三段,空白之後的數字『256』

為什麼第一段我要切『:00,』呢?就是怕祇有『00』的話可能文章中有其他數字會發生誤判,加上前面的那個冒號變成『:00,』誤判的機會就小很多。

切三段之後,每一段前後都用 ( ) 包起來,正規表示式解譯器才知道每一段文字要從哪裡開始,到哪裡結束。

原本的字串:00:00:00, 256

第一段,『(:00,)』
第二段,『( )』
第三段,『(256)』

這樣一來,解譯器就會在找到符合的字串後,把第一段的資料存在一個變數 $1,第二段存在 $2,第三段存 $3。因為我們不要第二段,所以搜尋到這個字串之後,把它取代為 $1$3 即可。

搜尋同類型的字串

不過等等,執行之後,祇有『:00, 256』取代為『:00,256』,後面的時間軸還是都沒變啊。

00:00:00,256 --> 00:00:01, 280

這是因為我們要求程式搜尋的是『(:00,)( )(256)』這樣的精確字串,程式也很盡責的幫我們找到符合的字串,我們要改讓程式幫我們搜尋『(:數字數字,)( )(數字數字數字)』這樣的組合。

在正規表示式裡『\d』(或『\d{1}』) 代表 0-9 的數字,『\d\d』(或『\d{2}』)可以代表 00-99 的數字,相同的,『\d\d\d』(或『\d{3}』)可表示三位數的 000-999;而『\s』可以表示空格。所以我們要搜尋的字串可以表示為:

原本的字串:00:00:00, 256

第一段,『(:\d\d,)』
第二段,『(\s)』
第三段,『(\d\d\d)』

之後祇要讓程式去搜尋符合這個類型的字串,並取代為 $1$3 的新組合,就完成工作嘍。

a
圖、利用正規表示式刪除字串中的字元

沒有留言:

張貼留言