本文介紹使用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裡的人的抱怨反...