2020年8月28日 星期五

C 語言 - 正規表示法實作 ( regex.h )

regex.h (Linux 原生, Windows 再說)

    Regex.h 實作主要分 3 階段,regcom, regexec, regfree。
    // 要被批配的 buffer 跟一些參數
    int status, len, i;
    char buf[1024], data[1024];
    getdata(data);

    // 正規表示式的會要先 compile (regcomp())並儲存在 regex_t 此資料結構
    regex_t preg;

    // 設定批配模式的 flag. 
    // REG_EXTENDED ERE (Extended Regular Expression, 不用就是 BRE)
    // REG_ICASE    忽略大小寫
    // REG_NOSUB    不儲存批配後的結果
    // REG_NEWLINE  識別換行符(^$ 這類符號會成每一行的開頭跟結尾), REG_NEWLINE 效力 > eflags
    int cflags = REG_EXTENDED | REG_NEWLINE;

    // 正規表示式的批配樣板
    const char * regex = "Name: ([A-Z a-z]+)\nYear of Birth: ([^\n]*)\n([^:]*: [^\n]*)";

    // pmatch 為 struct 陣列去儲存批配後的結果
    // pmatch.rm_so 批配到的子字串在 target string 的起始 index
    // pmatch.rm_eo 批配到的子字串在 target string 的終止 index
    // nmatch 為宣告 pmatch 的陣列大小
    const size_t nmatch = 10;
    regmatch_t pmatch[nmatch];
    
    // eflags 也會對批配做改動
    // REG_NOTBOL   開頭批配符號(^)永遠批配不到
    // REG_NOTEOL   結尾批配符號($)永遠批配不到
    // REG_STARTEND 是直接使用 pmatch[0] 的 rm_so 跟 rm_eo
    //   作為字串頭尾的 index 然後批配,是為了避免 target string 
    //   中間有終止符(\0) 或 字串太長 strlen() 會 fail.
    int eflags = 0;

    // compile regex 
    if( regcomp(&preg, regex, cflags) != 0 ) {
        puts("regex compile error!\n");
        return;
    }

    // 進行批配 status = 0 代表成功
    status = regexec(&preg, data, nmatch, pmatch, eflags);
    if (status == REG_NOMATCH) {
        printf("No Match\n");
    } else if (status == 0) {
        // pmatch[0] 所指的子字串會是整串
        // pmatch[1], pmatch[2]... 會是括弧裡 sub regex,通常拿來取真正想要的值
        for (i = 0; i < nmatch && pmatch[i].rm_so >= 0; ++i) {
            len = pmatch[i].rm_eo - pmatch[i].rm_so;
            strncpy(buf, data + pmatch[i].rm_so, len);
            buf[len] = '\0';
            printf("match %d :\n%s\n\n", i+1, buf);
        }
    }

    regfree(&preg);
    return;

測試資料 跟 結果

    測試資料
Name: JunYe
Year of Birth: 1993
Gender: Male
    結果
match 1 :
Name: JunYe
Year of Birth: 1993
Gender: Male

match 2 :
JunYe

match 3 :
1993

match 4 :
Gender: Male

Basic (BRE) and extended (ERE) regular expression

    在一些特殊字元處理不一樣, 請參考 GNU的說明
參考資料 :

2020年8月8日 星期六

英文歌詞翻譯 Jonathan Roy - Keeping Me Alive


You try to hold me down so I became a soldier
你想要控制所以我成為了戰士
Built up all theses walls and now I'm climbing over
監牢般的城牆如今我已越過
Those nasty bees are tempting me
那些令人惱人的念頭還在勸誘著我
Oh lord! But I ain't going back
主阿!我是不會回頭的
You take me for a fool (fool), that doesn't make me foolish
試圖讓我認知自己的愚笨,並不會使我變成真的笨蛋
Told me I was wrong (wrong), passion made you ruthless
試圖讓我認知自己的錯誤,這份情感只會讓你更無情。
Manipulate, it's just too late
試圖操弄一切,但已太晚
Oh lord! 'Cause I ain't going back no more
主阿!我再也不會回頭的
Your fueling of the flames gonna show you what I'm made of
你全心助長的這份火焰只會讓我更堅信自己
Breakin' every chain that you put on me
斷開所有你在我身上施加的枷鎖
You thought I wouldn't change but I grew on you
你以為我不會改變但我已然超越你
'Cause I will never be what you wanted
因為我永遠不會成為你的洋娃娃
This fire (this fire), this fire
這份火焰,這份情感
Is keeping me alive
只會讓我更深切地感受自我
Making me believe I couldn't do without you
想讓我相信沒有你我將會一事無成
Make it hard to leave you think it's all about you
想讓我相信我的世界只會繞著你旋轉而難以逃脫
You know I'll never be what you wanted
你知道我永遠不會成為你的洋娃娃
This fire (this fire), this fire
因為這份火焰,這份情感

I tried to get this weight off of my shoulders
試著甩開肩上所有的包袱
Built up all my strength I'm finally taking over
所以累積著力量,最後終於克服
Complicate, I don't appreciate
試著複雜一切,但我不苟同
Oh lord, 'cause I ain't going back no more
主阿!我再也不會回頭的

Your fueling of the flames gonna show you what I'm made of
你全心助長的這份火焰只會讓我更堅信自己
Breakin' every chain that you put on me
斷開所有你在我身上施加的枷鎖
You thought I wouldn't change but I grew on you
你以為我不會改變但我已然超越你
'Cause I will never be what you wanted
因為我永遠不會成為你的洋娃娃
This fire (this fire), this fire
這份火焰,這份情感
Is keeping me alive
只會讓我更深切地感受自我
Making me believe I couldn't do without you
想讓我相信沒有你我將會一事無成
Make it hard to leave you think it's all about you
想讓我相信我的世界只會繞著你旋轉而難以逃脫
You know I'll never be what you wanted
你知道我永遠不會成為你的洋娃娃
This fire (this fire), this fire
因為這份火焰,這份情感
Is keeping me alive
只會讓我更深切地感受自我
Keeping me alive, keeping me alive
讓我感受自己活著,自己的存在
This fire (this fire), this fire (is keeping me alive)
這份火焰,這份情感

Breakin' me, shakin' me, shapin' me
打擊我,動搖我,塑造我
Into what I never wanted, oh
試圖想讓我變成我所不願的
Breakin' me, shakin' me
打擊我,動搖我
Makin' my beatin' heart a little stronger
只會讓我更強烈活著

Popular Posts