久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2562|回復: 0
打印 上一主題 下一主題
收起左側

BCB6自帶的正則表達式功能

[復制鏈接]
跳轉到指定樓層
樓主
ID:3721 發表于 2015-1-5 13:50 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
對于C++下的正則表達式,我想用得比較多的應該就是Boost里的regex了。自從BCB2009自帶了Boost1.35以后,這個regex也自然進入了BCB自帶的功能行列。

對于還沒用上BCB2009的人來說也不用為了一個正則表達式功能急著找boost的安裝方法,其實BCB6早已經幫我們準備好了:TRegexp和pcre庫。不過當年Borland也太“謙虛”了點,竟然沒把這么重要的功能寫進幫助?!!

先看看輕量級的TRegexp
說它是輕量級是因為它沒有完整支持正則表達式,功能也很單一,只有一個find。看下面代碼演示:

    #include <stdio.h>
    #include <stdlib.h>
    #include <regexp.h>
    int main(int argc, char* argv[])
    {
        char szReg[]="[0-9]+";             // 正則表達式,表示一個或多個'0'到'9'的字符串
        char szStr[]="a123b03ad94fg45";    // 待匹配的字符串
        printf("Regex: %s/n",szReg);
        printf("Str: %s/n",szStr);
        printf("Result: /n");
        TRegexp regex(szReg);
        for(size_t len=0, nPos = regex.find(szStr,&len);   // 用find查找匹配的字符串。nPos返回子串位置[size_t(-1)表示沒找到匹配的字符串],len返回子串長度
            nPos!=size_t(-1);
            nPos = regex.find(szStr,&len,nPos+len))      // 從nPos+len位置開始繼續查找...
        {
            printf("%.*s/n", len, szStr+nPos);          // 打印出查找結果
        }
        system("pause");
        return 0;
    }


雖然就一個find,功能是寒磣了一點,好在使用還算方便。在它的基礎上做Match和Replace的功能也應該不算太難的事。

對正則表達式比較熟悉的朋友一定在想為什么不把char szReg[]="[0-9]+";改成char szReg[]="//d+";呢?這就是偶說它功能還不完整的原因,它不支持'/'操作符!(也許有其它替代,反正偶沒找到,要是哪位路過的知道TRegexp使用'/'的方法,一定要留個言哦)。

于是,下面我們請出完美的pcre庫。pcre庫的全稱是:Perl-compatible regular expressions。從名稱上可以看出它遵循的是Perl的正則表達式語法,功能那是絕對沒得說。不過遺憾的是BCB沒有進一步把pcrecpp也帶進來,所以只能用純C的方式調用了:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <pcre.h>
    int main(int argc, char* argv[])
    {
        char szReg[]="d(//d+)f";        // 抽出a和f之間的數字
        char szStr[]="a123b03ad94fg45";
        printf("Regex: %s/n",szReg);
        printf("Str: %s/n",szStr);
        printf("Result: /n");
        const char      *pszErr;
        int             nErrOffset;
        pcre *re = pcre_compile(szReg,0,&pszErr,&nErrOffset,NULL);      // 先準備表達式
        if(re==NULL)
        {
            printf("compile error at:%d, %s", nErrOffset, pszErr);
            return -1;
        }
        int ovector[30];    // 數量由szReg決定,大致為(括號對數+1)*3,可以用pcre_info獲得或者直接留大一點。
        int len = strlen(szStr);
        int rc = pcre_exec(re, NULL, szStr, len, 0, ovector, 30);   // 執行匹配
        for(int i=0; i<rc; i++)
        {
            char *substring_start = szStr + ovector[2*i];
            int substring_length = ovector[2*i+1] - ovector[2*i];
            printf("%2d: %.*s/n", i, substring_length, substring_start);
        }
        free(re);   // 別忘了這個
        system("pause");
        return 0;

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线亚洲一区二区 | 999www视频免费观看 | 国产精品日韩高清伦字幕搜索 | 久久精品一级 | 国产目拍亚洲精品99久久精品 | 欧美电影在线观看网站 | 一区二区三区四区电影视频在线观看 | 99re6热在线精品视频播放 | 成人av激情 | 日韩av在线一区二区 | 久久最新 | 一级毛片免费视频 | 日韩av成人在线 | 国产不卡视频 | 99国产精品久久久久 | 久久国产精品无码网站 | av色站 | 午夜精品久久久 | h片免费看 | 色桃网 | 草草视频在线观看 | 婷婷色国产偷v国产偷v小说 | 国产精品久久久久免费 | 国产欧美一区二区三区久久 | 欧美日本免费 | 精品视频 免费 | 九九久久免费视频 | 91精品国产乱码久久久久久久 | 免费在线成人 | 国产精品久久久久久二区 | 成人在线观看免费 | 中文字幕免费观看 | 在线不卡一区 | 欧美综合国产精品久久丁香 | 韩日在线视频 | 国产电影一区二区在线观看 | 精品一级 | 午夜影院在线视频 | 亚洲一区久久久 | 欧美人人 | 97超碰在线播放 |