C 中使用std regex提取lrc歌詞檔案

2021-07-03 08:41:35 字數 1143 閱讀 8223

本文介紹使用c++11中新增的std::regex而不是boost::regex提取lrc歌詞檔案中的資訊。

lrc檔案格式

[ti:親愛的小孩]

[ar:蘇芮]

[al:親愛的小孩]

[by:]

[offset:0]

[00:00.38]親愛的小孩 - 蘇芮

[00:01.79]詞:楊立德

[00:02.80]曲:陳復明

這是典型的lrc檔案樣例,其中開頭部分,ti、ar、al、by、offset、re、ve等資訊分別表示歌名、詞作者、**名、建立者、時間戳偏移值、建立應用名、版本號。屬於歌曲的基本資訊。

歌詞部分的格式為時間+歌詞,時間在中括號內,以分、秒、百分之一秒表示。

regex匹配

對於開頭部分基本資訊的匹配較為簡單,匹配括號及標籤即可。

下面介紹匹配歌詞正文部分的方法。

首先是從讀取的全文中匹配出每一行的內容。(假設輸入的lrc檔案未分行)下面**的輸入為全文歌詞str,輸出引數為乙個tuple,tuple中的項分別為歌曲開始到此句歌詞的百分之一秒數和本句歌詞內容。

auto res = (string str) -> list

long, string>>

\\.\\d\\][^\\*");

for (sregex_iterator i = std::sregex_iterator(str.begin(), str.end(), pattern); i != std::sregex_iterator(); ++i)

return tuple_res;

}(str);

匹配的方式是,首先匹配中括號,中括號裡面匹配3個數字,數字中間匹配冒號。中括號結束以後匹配非左中括號(如匹配\w會發生中文無法匹配的問題)。

在成功獲取每一行的內容後,匹配每一行中的右中括號,憑藉此將該串分割為時間與正文兩部分。此匹配過程中匹配字元簡單且只匹配一次,可以直接用find函式做。

將時間字串轉為以百分之一秒的數字代表的時間,自己實現gettime函式,可採用stringstream做型別轉換。將其與歌詞正文一起加入tuple。

示例**通過vs2015除錯。

Ext中使用提取的公用Store

一 頁面有太多的store 使用ext中,combo下拉框是常用的元素,一般情況下,每個combo都對應有store為其載入下拉資料。如果這些store都顯示地宣告 定義在用例的js指令碼中,這樣指令碼顯得有點亂。一般情況下,store需要載入的下拉資料都存放在資料庫共同的字典表中,store需要通...

Ext中使用提取的公用Store

一 頁面有太多的store 使用ext中,combo下拉框是常用的元素,一般情況下,每個combo都對應有store為其載入下拉資料。如果這些store都顯示地宣告 定義在用例的js指令碼中,這樣指令碼顯得有點亂。一般情況下,store需要載入的下拉資料都存放在資料庫共同的字典表中,store需要通...

C 中使用屬性

使用屬性,避免將資料成員直接暴露給外界 item always use properties instead of accessible data members.學習研究.net的早期,經常碰到一些學習c net的朋友問,要屬性這種華而不實的東西做什麼?後來做專案時也時常接到team裡的人的抱怨反...