广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++中正则表达式有哪些
  • 460
分享到

C++中正则表达式有哪些

2023-06-17 04:06:34 460人浏览 泡泡鱼
摘要

这篇文章主要讲解了“c++中正则表达式有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++中正则表达式有哪些”吧!1、C regex#include <regex.h&

这篇文章主要讲解了“c++正则表达式有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++中正则表达式有哪些”吧!

1、C 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);}    }    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 ;}

使用正则表达式可简单的分成几步:

  • 编译正则表达式

  • 执行匹配

  • 释放内存

首先,编译正则表达式

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

reqcomp()函数用于把正则表达式编译成某种格式,可以使后面的匹配更有效。

preg: regex_t结构体用于存放编译后的正则表达式;

regex: 指向正则表达式指针;

cflags:编译模式

共有如下四种编译模式:

REG_EXTENDED:使用功能更强大的扩展正则表达式

REG_ICASE:忽略大小写

REG_NOSUB:不用存储匹配后的结果

REG_NEWLINE:识别换行符,这样&lsquo;$&rsquo;就可以从行尾开始匹配,&lsquo;^&rsquo;就可以从行的开头开始匹配。否则忽略换行符,把整个文本串当做一个字符串处理。

其次,执行匹配

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

#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");elseprintf("ok\n");    }return 0 ;}

C++这个真心不想多说它,测试过程中发现 字符匹配的时候 &lsquo;a&rsquo;  是可以匹配的,a+也是可以的,[[:w:]]也可以匹配任意字符,但[[:w:]]+就只能匹配一个字符,+号貌似不起作用了。所以后来就干脆放弃了这伟大的C++正则,如果有大牛知道这里面我错在哪里了,真心感谢你告诉我一下,谢谢。

3、boost regex

  #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、对比情况

C++中正则表达式有哪些

总结

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();        }    }}

感谢各位的阅读,以上就是“C++中正则表达式有哪些”的内容了,经过本文的学习后,相信大家对C++中正则表达式有哪些这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: C++中正则表达式有哪些

本文链接: https://www.lsjlt.com/news/287119.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++中正则表达式有哪些
    这篇文章主要讲解了“C++中正则表达式有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++中正则表达式有哪些”吧!1、C regex#include <regex.h&...
    99+
    2023-06-17
  • js正则表达式和php正则表达式有哪些区别
    这篇文章主要介绍了js正则表达式和php正则表达式有哪些区别的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇js正则表达式和php正则表达式有哪些区别文章都会有所收获,下面我们一起来看看吧。区别:1、PHP正则表...
    99+
    2023-06-29
  • php正则表达式有哪些
    php正则表达式有"/pattern/"、"^"、"$"、"."、"[]"、"[^]"、"[a-z]"、"[A-Z]"、"[0-9]"、"\d"、"\D"、"\w"、"\W"、"\s"、"\S"、"\b"、"*"、"+"、""、"{n}"、...
    99+
    2023-11-17
    php PHP正则表达式
  • java正则表达式有哪些
    这篇文章主要为大家展示了“java正则表达式有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“java正则表达式有哪些”这篇文章吧。 java正则表达式大全...
    99+
    2022-10-19
  • Python正则表达式有哪些
    小编给大家分享一下Python正则表达式有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1 前言正则表达式是对字符串(包括普通字符(例如,a 到 z 之间的字...
    99+
    2023-06-15
  • C#正则表达式的知识点有哪些
    这篇“C#正则表达式的知识点有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C#正则表达式的知识点有哪些”文章吧。一、简...
    99+
    2023-06-30
  • Flex正则表达式规则有哪些
    这篇文章给大家分享的是有关Flex正则表达式规则有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Flex正则表达式(regularexpression)就是用一个“字符串”来描述一个特征,然后去验证另一个“字...
    99+
    2023-06-17
  • Python中的正则表达式有哪些
    这篇文章给大家介绍Python中的正则表达式有哪些,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。什么是正则表达式?正则表达式(Regular Expression)通常被用来检索、替换那些符合某个模式(规则)的文本。此...
    99+
    2023-06-08
  • C#正则表达式语法的相关规则有哪些
    这篇文章主要介绍“C#正则表达式语法的相关规则有哪些”,在日常操作中,相信很多人在C#正则表达式语法的相关规则有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#正则表达式语法的相关规则有哪些”的疑惑有所...
    99+
    2023-06-17
  • 正则表达式常用规则有哪些
    这篇文章将为大家详细讲解有关正则表达式常用规则有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。我们来看一下正则常用规则:一张图足以说明一切,哈哈哈!!方法:find()查找findall()查找所有内...
    99+
    2023-06-20
  • python中有哪些正则表达式语法
    python中有哪些正则表达式语法?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。python可以做什么Python是一种编程语言,内置了许多有效的工具,Pyth...
    99+
    2023-06-14
  • web正则表达式实例有哪些
    这篇文章主要讲解了“web正则表达式实例有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“web正则表达式实例有哪些”吧!正则表达式(regular expression)描述了一种字符串...
    99+
    2023-06-03
  • JavaScript正则表达式函数有哪些
    这篇文章主要为大家展示了“JavaScript正则表达式函数有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JavaScript正则表达式函数有哪些”这篇文...
    99+
    2022-10-19
  • JS常用正则表达式有哪些
    这篇文章主要讲解了“JS常用正则表达式有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JS常用正则表达式有哪些”吧!匹配正则使用 .test() 方法l...
    99+
    2022-10-19
  • 正则表达式测试站有哪些
    这篇文章主要介绍了正则表达式测试站有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、RegExr2、Online Regular Ex...
    99+
    2022-10-19
  • Python3常用正则表达式有哪些
    这篇文章主要介绍“Python3常用正则表达式有哪些”,在日常操作中,相信很多人在Python3常用正则表达式有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python3常用正则表达式有哪些”的疑惑有所...
    99+
    2023-06-19
  • 正则表达式操作符有哪些
    这篇文章主要介绍正则表达式操作符有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!常用匹配.(匹配任何单个字符。例如正则表达式r.t匹配这些字符串:rat、rut、r t,但是不匹配root)$(匹配行结束符。例如...
    99+
    2023-06-17
  • Python正则表达式技巧有哪些
    本篇内容介绍了“Python正则表达式技巧有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、什么是Python则表达式在编写处理字符串...
    99+
    2023-06-17
  • Python正则表达式写法有哪些
    这篇文章主要讲解了“Python正则表达式写法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python正则表达式写法有哪些”吧!什么是正则表达式?正则表达式(Regular Expr...
    99+
    2023-06-15
  • 正则表达式的匹配规则有哪些
    正则表达式的匹配规则有以下几种:1. 字符匹配:使用普通字符来匹配输入的相应字符。2. 通配符匹配:使用特殊字符来匹配任意一个字符。...
    99+
    2023-09-26
    正则表达式
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作