精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

C++中三種正則表達式比較

開發 后端
之后我變換了匹配的字符串,將其長度生了一倍,達到每個100字符左右(代碼里面所示),匹配速度就下來了,但是也能達到 100w/s左右,這肯定滿足我們現在的需求了。

工作需要用到C++中的正則表達式,所以就研究了以上三種正則。

1、C regex

/*  write by xingming  *  time:2012年10月19日15:51:53  *  for: test regex  *  */

#include <regex.h>
#include <iostream>
#include <sys/types.h>
#include <stdio.h>
#include <cstring>
#include <sys/time.h>

using namespace std;
const int times = 1000000;

int main(int argc,char** argv) {
    char pattern[512]="finance\.sina\.cn|stock1\.sina\.cn|3g\.sina\.com\.cn.*(channel=finance|_finance$|ch=stock|/stock/)|dp.sina.cn/.*ch=9&";
    const size_t nmatch = 10;
    regmatch_t pm[10];
    int z ;
    regex_t reg;
    char lbuf[256]="set",rbuf[256];
    char buf[3][256] = {"finance.sina.cn/google.com/baidu.com.google.sina.cndddddddddddddddddddddda.sdfasdfeoasdfnahsfonadsdf",
                    "3g.com.sina.cn.google.com.dddddddddddddddddddddddddddddddddddddddddddddddddddddbaidu.com.sina.egooooooooo",
                    "http://3g.sina.com.cn/google.baiduchannel=financegogo.sjdfaposif;lasdjf.asdofjas;dfjaiel.sdfaosidfj"};
    printf("input strings:\n");
    timeval end,start;
    gettimeofday(&start,NULL);
    regcomp(&reg,pattern,REG_EXTENDED|REG_NOSUB);
    for(int i = 0 ; i < times; ++i)
    {
        for(int j = 0 ; j < 3; ++j)
        {
            z = regexec(&reg,buf[j],nmatch,pm,REG_NOTBOL);
/*          if(z==REG_NOMATCH)                 printf("no match\n");             else                 printf("ok\n");                 */
        }
    }
    gettimeofday(&end,NULL);
    uint time = (end.tv_sec-start.tv_sec)*1000000 + end.tv_usec - start.tv_usec;
    cout<<time/1000000<<" s and "<<time%1000000<<" us."<<endl;
    return 0 ;
}

使用正則表達式可簡單的分成幾步:

  • 1.編譯正則表達式
  • 2.執行匹配
  • 3.釋放內存

首先,編譯正則表達式

int regcomp(regex_t *preg, const char *regex, int cflags);

reqcomp()函數用于把正則表達式編譯成某種格式,可以使后面的匹配更有效。

preg: regex_t結構體用于存放編譯后的正則表達式;

regex: 指向正則表達式指針;

cflags:編譯模式

共有如下四種編譯模式:

REG_EXTENDED:使用功能更強大的擴展正則表達式

REG_ICASE:忽略大小寫

REG_NOSUB:不用存儲匹配后的結果

REG_NEWLINE:識別換行符,這樣‘$’就可以從行尾開始匹配,‘^’就可以從行的開頭開始匹配。否則忽略換行符,把整個文本串當做一個字符串處理。

其次,執行匹配

int regexec(const regex_t *preg, const char *string, size_t nmatch, regmatch_t pmatch[], int eflags);

preg: 已編譯的正則表達式指針;

string:目標字符串;

nmatch:pmatch數組的長度;

pmatch:結構體數組,存放匹配文本串的位置信息;

eflags:匹配模式

共兩種匹配模式:

REG_NOTBOL:The match-beginning-of-line operator always fails to match  (but see  the  compilation  flag  REG_NEWLINE above). This flag may be used when different portions of a string are passed  to  regexec and the beginning of the string should not be interpreted as the beginning of the line.

REG_NOTEOL:The match-end-of-line operator always fails to  match  (but  see the compilation flag REG_NEWLINE above)

***,釋放內存

void regfree(regex_t *preg);

當使用完編譯好的正則表達式后,或者需要重新編譯其他正則表達式時,一定要使用這個函數清空該變量。

其他,處理錯誤

size_t regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size);

當執行regcomp 或者regexec 產生錯誤的時候,就可以調用這個函數而返回一個包含錯誤信息的字符串。

errcode: 由regcomp 和 regexec 函數返回的錯誤代號。

preg: 已經用regcomp函數編譯好的正則表達式,這個值可以為NULL。

errbuf: 指向用來存放錯誤信息的字符串的內存空間。

errbuf_size: 指明buffer的長度,如果這個錯誤信息的長度大于這個值,則regerror 函數會自動截斷超出的字符串,但他仍然會返回完整的字符串的長度。所以我們可以用如下的方法先得到錯誤字符串的長度。

當然我在測試的時候用到的也比較簡單,所以就直接用了,速度一會再說!

2、C++ regex

/*  write by xingming  *  time:2012年10月19日15:51:53  *  for: test regex  *  */

#include <regex>
#include <iostream>
#include <stdio.h>
#include <string>

using namespace std;

int main(int argc,char** argv) {
    regex pattern("[[:digit:]]",regex_constants::extended);
    printf("input strings:\n");
    string buf;

    while(cin>>buf)
    {
        printf("*******\n%s\n********\n",buf.c_str());

        if(buf == "quit")
        {
            printf("quit just now!\n");
            break;
        }

        match_results<string::const_iterator> result;
        printf("run compare now!  '%s'\n", buf.c_str());
        bool valid = regex_match(buf,result,pattern);
        printf("compare over now!  '%s'\n", buf.c_str());

        if(!valid)
            printf("no match!\n");
        else
            printf("ok\n");
    }

    return 0 ;
}

C++這個真心不想多說它,測試過程中發現 字符匹配的時候 ‘a’ 是可以匹配的,a+也是可以的,[[:w:]]也可以匹配任意字符,但[[:w:]]+就只能匹配一個字符,+號貌似不起作用了。所以后來就干脆放棄了這偉大的C++正則,如果有大牛知道這里面我錯在哪里了,真心感謝你告訴我一下,謝謝。

3、boost regex

/* write by xingming
 * for:test boost regex
 * time:2012102311:35:33
 * */  #include <iostream> #include <string> #include <sys/time.h>
#include "boost/regex.hpp"

using namespace std;
using namespace boost;
const int times = 10000000;

int main()
{
    regex  pattern("finance\\.sina\\.cn|stock1\\.sina\\.cn|3g\\.sina\\.com\\.cn.*(channel=finance|_finance$|ch=stock|/stock/)|dp\\.s ina\\.cn/.*ch=9&");
    cout<<"input strings:"<<endl;
    timeval start,end;
    gettimeofday(&start,NULL);
    string input[] = {"finance.sina.cn/google.com/baidu.com.google.sina.cn",
                      "3g.com.sina.cn.google.com.baidu.com.sina.egooooooooo",
                      "http://3g.sina.com.cn/google.baiduchannel=financegogo"};
    for(int i = 0 ;i < times; ++ i)
    {
        for(int j = 0 ; j < 3;++j)
        {
            //if(input=="quit")
            //  break;
            //cout<<"string:'"<<input<<'\''<<endl;
            cmatch what;
            if(regex_search(input[j].c_str(),what,pattern)) ;
            //  cout<<"OK!"<<endl;
            else ;
            //  cout<<"error!"<<endl;
        }
    }
    gettimeofday(&end,NULL);
    uint time = (end.tv_sec-start.tv_sec)*1000000 + end.tv_usec - start.tv_usec;
    cout<<time/1000000<<" s and "<<time%1000000<<" us."<<endl;
    return 0 ;
}

boost正則不用多說了,要是出去問,C++正則怎么用啊?那90%的人會推薦你用boost正則,他實現起來方便,正則庫也很強大,資料可以找到很多,所以我也不在闡述了。

4、對比情況

%e5%8e%bb%e5%8e%bb%e5%8e%bb

總結:

C regex的速度讓我吃驚啊,相比boost的速度,C regex的速度幾乎要快上3倍,看來正則引擎的選取上應該有著落了!

上面的表格中我用到的正則和字符串是一樣的(在代碼中C regex的被我加長了),速度相差幾乎有3倍,C的速度大約在30+w/s , 而boost的速度基本在15-w/s ,所以對比就出來了!

在這里Cregex的速度很讓我吃驚了已經,但隨后我的測試更讓我吃驚。

我以前在.net正則方面接觸的比較多,就寫了一個.net版本的作為對比

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace 平常測試
{
    class Program
    {
        static int times = 1000000;
        static void Main(string[] args)         {
            Regex reg = new Regex(@"(?>finance\.sina\.cn|stock1\.sina\.cn|3g\.sina\.com\.cn.*(?:channel=finance|_finance$|ch=stock|/stock/)|dp.sina.cn/.*ch=9&)",RegexOptions.Compiled);
            string[] str = new string[]{@"finance.sina.cn/google.com/baidu.com.google.sina.cn",
                    @"3g.com.sina.cn.google.com.baidu.com.sina.egooooooooo",
                    @"http://3g.sina.com.cn/google.baiduchannel=financegogo"};
            int tt = 0;
            DateTime start = DateTime.Now;
            for (int i = 0; i < times; ++i)
            {
                for (int j = 0; j < 3; ++j)
                {
                    if (reg.IsMatch(str[j])) ;
                        //Console.WriteLine("OK!");
                    //else
                        //Console.WriteLine("Error!");
                }
            }
            DateTime end = DateTime.Now;
            Console.WriteLine((end - start).TotalMilliseconds);
            Console.WriteLine(tt);
            Console.ReadKey();
        }
    }
}

結果發現,正則在不進行RegexOptions.Compiled 的時候,速度和C regex的基本一樣,在編譯只會,速度會比C regex快上一倍,這不由得讓我對微軟的那群人的敬畏之情油然而生啊。

但隨后我去查看了一下該博客上面C regex的描述,發現我可以再申明正則的時候加入編譯模式,隨后我加入了上面代碼里的 REG_NOSUB(在先前測試的時候是沒有加入的),結果讓我心理面很激動的速度出來了,C regex 匹配速度竟然達到了 300+w/s,也就是比原來的(不加入REG_NOSUB)的代碼快了將近10倍。

之后我變換了匹配的字符串,將其長度生了一倍,達到每個100字符左右(代碼里面所示),匹配速度就下來了,但是也能達到 100w/s左右,這肯定滿足我們現在的需求了。

結果很顯然,當然會選擇C regex了。

責任編輯:張燕妮 來源: pmars的博客
相關推薦

2010-07-19 16:11:20

Perl正則表達式

2010-07-14 09:24:22

Perl正則表達式

2009-08-17 13:56:28

C#正則表達式入門

2009-08-03 17:27:14

C#正則表達式

2009-08-07 15:16:10

C#正則表達式

2018-09-27 15:25:08

正則表達式前端

2020-09-04 09:16:04

Python正則表達式虛擬機

2010-03-03 12:53:50

Linux正則表達式

2009-08-13 15:24:27

C#正則表達式

2009-08-11 13:00:41

C#正則表達式

2024-12-16 07:33:45

C#正則表達式

2024-09-14 09:18:14

Python正則表達式

2010-03-25 18:25:36

Python正則表達式

2016-11-10 16:21:22

Java 正則表達式

2009-09-16 17:15:57

正則表達式引擎

2022-01-04 11:35:03

Linux Shel正則表達式Linux

2023-09-13 08:12:45

2022-03-28 06:19:14

正則表達式開發

2017-05-12 10:47:45

Linux正則表達式程序基礎

2021-01-27 11:34:19

Python正則表達式字符串
點贊
收藏

51CTO技術棧公眾號

无码人妻精品一区二区三区温州| 99re99热| 中文字幕777| 91精品二区| 在线视频1卡二卡三卡| 欧美精品aa| 亚洲视频一区二区| 久久久久无码精品| 欧美magnet| 亚洲女爱视频在线| 欧美日韩国产免费一区二区三区| 一级特黄aaa大片| 亚洲美女91| 精品国产一区av| 中文字幕丰满孑伦无码专区| 伊人久久大香伊蕉在人线观看热v| 亚洲国产日韩精品| 亚洲一区二区在线免费观看| 高潮一区二区三区乱码| 免费观看日韩av| 久久久亚洲网站| 成人做爰视频网站| 亚洲v天堂v手机在线| 91精品国产91久久久久久一区二区 | 中文字幕无线精品亚洲乱码一区| 国产乱国产乱老熟300部视频| 欧美gay囗交囗交| 亚洲成国产人片在线观看| 一区二区三区视频| 激情福利在线| 91偷拍与自偷拍精品| 97超级碰碰| 国产精品毛片一区二区在线看舒淇| 性色一区二区三区| 国内精品中文字幕| 欧美日韩国产精品综合| 婷婷综合五月| 最近2019中文字幕在线高清 | 国产精品国产| 日韩丝袜情趣美女图片| 亚洲欧美日本一区二区| 热久久久久久| 欧美另类久久久品| 国产精品一区二区小说| 国产国产一区| 在线观看中文字幕不卡| 国产无套粉嫩白浆内谢的出处| 在线毛片观看| 日韩欧美黄色动漫| 亚洲中文字幕无码不卡电影| 91九色国产在线播放| 亚洲综合激情小说| 国产精品www在线观看| 国产精品69xx| 午夜精品影院在线观看| 久久久久久www| 韩日毛片在线观看| 欧美日韩在线另类| www一区二区www免费| 在线看片国产福利你懂的| 欧美午夜影院在线视频| 精品久久久久av| 日本一区二区电影| 欧美日韩三级一区| 五月六月丁香婷婷| 视频一区国产| 亚洲国产精品999| 短视频在线观看| 精品美女视频| 久久久国产一区二区三区| 欧美精品xxxxx| 亚洲精品系列| 国产精品第二页| 国产精品视频一区二区三区,| 精品亚洲国内自在自线福利| 2014亚洲精品| 视频一区二区三区国产| 国产日韩欧美精品一区| 在线免费观看成人网| 色女人在线视频| 精品久久久一区| 五月婷婷丁香综合网| 国产一区二区av在线| 亚洲成人黄色网址| 91网站免费视频| 色综合天天综合网中文字幕| 欧美激情视频一区| 男人天堂av在线播放| 国产在线播放一区| 精品久久久久久综合日本| av一区在线观看| 一区二区三区波多野结衣在线观看 | 91久久大香伊蕉在人线| 国产精品日韩一区二区三区| 中文字幕第3页| 欧美变态网站| 日韩有码在线电影| 欧美一级视频免费观看| 美女网站色91| 狠狠色综合网站久久久久久久| 美女欧美视频在线观看免费 | 国产亚洲成av人片在线观看 | wwwwwxxxx日本| 国产伦精品一区二区三区免费优势| 亚洲日韩中文字幕在线播放| 成年人av电影| 久久中文精品| 国产精品一区二区不卡视频| av男人的天堂在线| 激情av一区二区| 一区二区久久精品| 九九久久成人| 国产69精品久久久久9999| 激情五月婷婷网| 高清在线成人网| 一区二区三区视频| 天堂久久午夜av| 亚洲国产精品va在线观看黑人| 黄色录像免费观看| 久久精品九九| 精品国产乱码久久久久久蜜柚 | 国产精品手机在线播放| 欧美理论电影在线观看| 中文字幕一区二区人妻痴汉电车 | 日韩精品电影一区二区三区| 亚洲人成人一区二区三区| 91美女福利视频高清| 国产美女性感在线观看懂色av| 亚洲一区视频在线| 女人扒开腿免费视频app| 99tv成人| 国产精品美乳一区二区免费 | 国产巨乳在线观看| 国产精品视频一二三| 人妻熟女一二三区夜夜爱| 久久久久久毛片免费看| 欧美激情亚洲一区| 午夜精品久久久久久久爽| 亚洲三级理论片| 91 视频免费观看| 色综合久久一区二区三区| 国产精品扒开腿做爽爽爽视频| 青青草在线播放| 狠狠干狠狠久久| 四虎永久免费影院| 美女诱惑一区| 欧美日韩精品免费看| 韩日成人影院| 亚洲欧洲高清在线| 手机av免费观看| 日本一区二区高清| 天天综合网久久| 外国成人免费视频| 3d蒂法精品啪啪一区二区免费| 高清免费电影在线观看| 日韩一区二区视频| 国产一级特黄毛片| 97久久超碰国产精品电影| 欧美日韩亚洲第一| 成人精品中文字幕| 成人网页在线免费观看| av免费在线观| 亚洲成人激情图| 日韩精品在线观看免费| 久久久噜噜噜久噜久久综合| 国产福利一区视频| 国产精品传媒精东影业在线| 91在线免费视频| 欧美videosex性极品hd| 亚洲第一色在线| 无码人妻丰满熟妇区bbbbxxxx| 日本一区二区动态图| 日本女人黄色片| 一区二区日韩免费看| 日韩国产高清一区| 白嫩亚洲一区二区三区| 欧美激情a在线| 青青青草网站免费视频在线观看| 欧美三电影在线| 国产一级片播放| 国产日本欧洲亚洲| 樱花草www在线| 亚洲女优在线| 自拍偷拍视频在线| 欧美调教网站| 成人av在线亚洲| 免费h在线看| 色青青草原桃花久久综合| 国产高清在线观看视频| 色综合天天综合网天天看片| 亚洲区一区二区三| 99久久精品一区二区| 亚洲欧美视频二区| 亚洲精品激情| 在线免费观看一区二区三区| 欧美交a欧美精品喷水| 国产欧美一区二区三区久久| 精品精品导航| 色吧影院999| 无码精品人妻一区二区| 91麻豆精品国产91久久久 | 69av一区二区三区| 久久中文字幕免费| 亚洲综合视频在线| 懂色av蜜臀av粉嫩av永久| 91在线观看地址| 国产毛片久久久久久| 日日摸夜夜添夜夜添亚洲女人| 亚洲啊啊啊啊啊| 日韩中文在线电影| 欧美系列一区| 欧美男人操女人视频| 91国产在线免费观看| 99久久久国产精品免费调教网站| 97国产精品免费视频| а√中文在线8| 中日韩美女免费视频网站在线观看 | 奇米色一区二区| 日本www在线播放| 国产精品hd| 日本女人高潮视频| 日韩欧美中字| 日本一区免费看| 日本成人a网站| 国产传媒一区| 亚洲综合色婷婷在线观看| 国产免费一区二区三区香蕉精| 福利在线免费视频| 欧美激情videoshd| 天堂av中文在线| 美女久久久久久久久久久| 日本www在线观看视频| 亚洲视频999| 久草福利在线| 亚洲色图校园春色| 黄视频在线播放| 亚洲视频日韩精品| 久久久久久久久亚洲精品| 日韩精品福利网站| 天天av综合网| 亚洲码在线观看| 男生女生差差差的视频在线观看| 日韩福利视频在线观看| 无码精品黑人一区二区三区| 亚洲国产欧美一区二区丝袜黑人| 欧美熟妇另类久久久久久不卡| 精品久久国产老人久久综合| 精品区在线观看| 亚洲第一福利视频| 五月婷婷综合久久| 国产丝袜一区视频在线观看 | 自拍视频在线观看一区二区| 国产小视频你懂的| 中文字幕一区二区三区av| 天天色天天综合| 一区二区三区四区精品在线视频| 麻豆国产尤物av尤物在线观看| 亚洲综合另类小说| 国产又大又黄视频| 91成人网在线| 一级片视频网站| 欧美大片顶级少妇| 五月婷婷在线观看视频| 亚洲午夜精品久久久久久性色 | av一区二区高清| 亚洲ai欧洲av| 欧美在线高清| 久久久久久久久久久99| 久久www成人_看片免费不卡| 天堂中文视频在线| 国产精品自拍一区| 天天躁日日躁狠狠躁免费麻豆| 26uuu色噜噜精品一区| 亚欧精品视频一区二区三区| 1000精品久久久久久久久| 欧美日韩一级在线观看| 欧美日韩国产精品一区二区不卡中文| 9i精品福利一区二区三区| 欧美群妇大交群中文字幕| 韩国av免费在线观看| 亚洲天堂2020| 影音先锋在线播放| 欧美主播福利视频| 宅男噜噜噜66国产精品免费| 国产欧美日韩综合一区在线观看| 精品产国自在拍| 无码人妻aⅴ一区二区三区日本| 日韩视频一区| 色噜噜狠狠一区二区| www..com久久爱| 毛片视频免费播放| 香蕉加勒比综合久久| 亚洲国产无线乱码在线观看| 成人直播在线观看| 亚洲va欧美va国产综合剧情| 婷婷亚洲精品| 亚洲国产精品影视| 久久aⅴ国产紧身牛仔裤| 国产男女无遮挡猛进猛出| 26uuu国产一区二区三区| 日韩一级片大全| 色偷偷久久一区二区三区| wwwav在线播放| 在线丨暗呦小u女国产精品| 大菠萝精品导航| 91原创国产| 999成人精品视频线3| 免费观看精品视频| 成人激情视频网站| 国产在线观看免费视频软件| 色综合色狠狠综合色| 成人无码一区二区三区| www.日韩系列| 久久久人成影片一区二区三区在哪下载 | zzijzzij亚洲日本少妇熟睡| www.av免费| 欧美亚洲一区二区在线观看| 亚洲AV第二区国产精品| 欧美老女人xx| 国产精品一级在线观看| 色综合久久av| 久久久久久色| 激情综合丁香五月| 亚洲成人动漫在线观看| 国产绳艺sm调教室论坛| 色吧影院999| 另类中文字幕国产精品| 欧美日韩在线高清| 国产视频欧美| 欲求不满的岳中文字幕| 亚洲一区二区精品视频| 国内老熟妇对白xxxxhd| 久久精品国产免费观看| 日本免费成人| 亚洲不卡中文字幕| 日本成人中文字幕在线视频| 午夜精产品一区二区在线观看的| 欧美日韩亚洲一区二区| 午夜福利视频一区二区| 97视频在线观看免费高清完整版在线观看 | 欧美1区2区视频| 特种兵之深入敌后| 亚洲毛片av在线| 精品人妻av一区二区三区| 九九久久国产精品| 91国内精品| 丁香六月激情婷婷| 成人美女视频在线观看18| 国产一级特黄a高潮片| 精品福利在线导航| 国产精品25p| 欧美 日韩 国产在线| 久热精品视频| 综合 欧美 亚洲日本| 91精品久久久久久久91蜜桃| 老司机精品影院| 岛国视频一区| 国产精品毛片在线| 人妻一区二区视频| 欧美视频一区二区三区在线观看| av女优在线| 不卡视频一区二区| a91a精品视频在线观看| 受虐m奴xxx在线观看| 欧美日韩一区二区欧美激情| 黄色网在线播放| 岛国视频一区免费观看| 亚洲综合丁香| 91狠狠综合久久久久久| 欧美一区二区日韩| zzzwww在线看片免费| 五月天丁香综合久久国产| 精品在线一区二区三区| 麻豆成人在线视频| 亚洲男人第一av网站| 欧美成人aaa| 国产夫妻自拍一区| 国产欧美一区视频| aaa一区二区| 欧美在线视频观看| 999精品一区| aaaaa一级片| 4438成人网| 操喷在线视频| 小说区图片区图片区另类灬| 国产麻豆欧美日韩一区| 日韩av大片在线观看| 久久久成人精品视频| 色天下一区二区三区| 超碰人人草人人| 精品欧美国产一区二区三区| 欧美性猛交xxx乱大交3蜜桃| 国产精品一区而去| 久久精品二区亚洲w码| 天堂网一区二区三区| 久久精品国产亚洲精品2020| 欧美黑人巨大videos精品| 波多野结衣免费观看| 91高清在线观看| 看黄在线观看|