程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> REGEX.C GNU 提取過濾數據,regex.cgnu

REGEX.C GNU 提取過濾數據,regex.cgnu

編輯:關於C語言

REGEX.C GNU 提取過濾數據,regex.cgnu


今天被@SVCHAO  勾起興趣來了。。 有把正則表達式興趣撿起來了,試了下notepad++基本上語法倒是沒有忘記,不過如果是用在嵌入式的方案的話,似乎還是有點費勁的。

先mark一個基礎語法。

單個字符匹配

采用方括號描述,例如[0135678]表示0 1 3 5 6 7 8 都可以通過該次匹配

采用方括號排除,例如[^azAZ]表示除了a z A 和Z 全部可以通過該字節匹配

允許使用-表示范圍,例如[0-9a-zA-Z]表示所有數字跟字母

常用單個字符存在通用表達方式,例如\w 表示[0-9a-zA-Z] 剩下的慢慢補充

采用{}表示匹配次數描述,例如\w{2}表示連續兩個字符都是數字或者字母

采用()捕獲比較結果…

 

以上內容自行科普。

為了適應使用場景為嵌入式 找到了這個demo

slre(Github Super Light Regular Expression library)

但是我好像不支持{},而且沒找到貪婪相關的… 所以暫時擱置

 

後來說熟悉一下GNU裡面的regex.h

發現跟python的regex接口很像 應該是posix的原因。

坑爹的虛擬機 很久沒更新了,折騰了一會環境之後總算是測試出效果了。

#include <stdio.h>
#include <sys/types.h>
#include <regex.h>

int main(int char_c,char** char_v)
{
    char* p_str = "  Url        =  www.google.com.hk ;";
    char* p_reg = " {0,}(\\S+) {0,}= {0,}(\\S+) {0,};";

    regex_t reg;
    regmatch_t matchs[20];
    memset(matchs,0,sizeof(matchs));
    int r;

    r = regcomp(&reg, p_reg, REG_EXTENDED);

    r = regexec(&reg, p_str, 20, matchs, 0);
    return 0;
}

因為是自己測試用的代碼,所以並沒有特地去做輸出、直接斷點打下來看就知道結果了,

其中REG_EXTENDED一定要加,不然某些特性用不了,

還有一個奇怪的點就是,matchs[0]中會存放一個整個p_reg的匹配范圍,所以如果是只需要提取我們定義中()的目標結果的話、

從p_reg[1]開始就好了。

順手吐槽下C的字符串語法、調了好久… 結果是\跟\\的鍋… 不過似乎也沒什麼更高效的方案。

下一步如果再用到的話,可能就是手動往SLRE裡面添加貪婪的部分、或者找到GNU的regex.c進行裁剪了…

 

到時候再說

#include <stdio.h>
#include <sys/types.h>
#include <regex.h>
#include <string.h>

int main(int char_c, char** char_v) {
    char* p_str = "  Url        =  www.google.com.hk ;";
    char* p_reg = " {0,}(\\S+) {0,}= {0,}(\\S+) {0,};";

    regex_t reg;
    regmatch_t matchs[20];
    int r, i;

    r = regcomp(&reg, p_reg, REG_EXTENDED);
    if (r != 0) {
        printf("err");
    }

    r = regexec(&reg, p_str, 20, matchs, 0);
    if (r != 0) {
        printf("err");
    }

    for (i = 0; i < 20; i++) {
        int start_index = matchs[i].rm_so;
        int end_index = matchs[i].rm_eo;
        int len = end_index - start_index;

        if (start_index >= 0) {
            char dis_buffer[256];
            strncpy(dis_buffer, &p_str[start_index], len);
            dis_buffer[len]='\0';
            printf("catch:%s\n",dis_buffer);
        }
    }

    return 0;
}

 

鑒於我抓輸出抓了很久… 我決定還是把數據捕獲的代碼貼出來…

使用環境為G++ with eclipse-cdt

debug用習慣了就沒換IDE

catch:  Url        =  www.google.com.hk ;
catch:Url
catch:www.google.com.hk

測試輸出結果是正確的…

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved