我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C++怎么使用正则表达式

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C++怎么使用正则表达式

今天小编给大家分享一下C++怎么使用正则表达式的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

    正则表达式

    正则表达式(regular expression)是一种描述字符序列的方法,是一种极其强大的计算工具。

    C++正则表达式库(RE库)定义在<regex>中,它包含多个组件。

    RE库组件

     解释
    regex表示有一个正则表达式的类
    regex_match将一个字符序列与一个正则表达式匹配
    regex_search寻找第一个与正则表达式匹配的子序列
    regex_replace使用给定格式替换一个正则表达式
    sregex_iterator迭代器适配器,调用regex_search来遍历一个string中所有匹配的子串
    smatch容器类,保存在string中搜索的结果
    ssub_matchstring中匹配的子表达式的结果

    正则表达式的使用

    #include <regex>void test(){    //查找不是在字符c之后的ei组合存在的单词string pattern("[^c]ei");pattern = "[[:alpha:]]*" + pattern + "[[:alpha:]]*";regex r(pattern);smatch results;string test_str("receipt freind theif receive");if (regex_search(test_str, results, r))cout << results.str() << endl;//freind}

    regex迭代器类型

    上面的程序只能查找第一个匹配到的单词,如果想获得所有匹配,可以使用sregex_iterator

    for (sregex_iterator it(test_str.begin(),test_str.end(),r), end_it;it != end_it;++it) {cout << it->str() << endl;}

    输出:

    freind
    theif

    for循环中定义了两个迭代器,it负责寻找匹配的单词,end_it是一个空迭代器,起到尾后迭代器的作用。

    解引用迭代器会得到一个匹配结果的smatch对象。

    除了得到匹配的smatch对象以外,还可以得到其上下文。

    for (sregex_iterator it(test_str.begin(),test_str.end(),r), end_it;it != end_it;++it) {auto pos = it->prefix().length();pos = pos > 40 ? pos - 40 : 0;cout << it->prefix().str().substr(pos)<< "[ " << it->str() << " ]"<< it->suffix().str().substr(0, 40)<< endl;}

    输出:

    receipt [ freind ] theif receive
     [ theif ] receive

    使用prefix和suffix函数可以得到匹配之前和之后的ssub_match对象。

    smatch相关操作

     解释
    m.ready()若已通过regex_search或regex_match设置了m,则返回true;否则返回false
    m.size()如果匹配失败,返回0;否则返回最近一次匹配的正则表达式中子表达式的数目
    m.empty()若m.size()==0,返回true
    m.prefix()一个ssub_match对象,表示当前匹配之前的序列
    m.suffix()一个ssub_match对象,表示当前匹配之后的部分
    m.format()格式化输出
    m.length(n)第n个匹配的子表达式的大小
    m.position(n)第n个子表达式距序列开始的距离
    m.str(n)第n个子表达式匹配的string
    m[n]对应第n个子表达式的ssub_match对象
    m.begin(),m.end()m中sub_match元素范围的迭代器
    m.cbegin(),m.cend()m中sub_match元素范围的常量迭代器

    这些操作也适用于cmatch、wsmatch、wcmatch和对应的子匹配对象。

    子表达式

    正则表达式中的模式通常包含一个或多个子表达式(subexpression)。

    一个子表达式是模式的一部分,本身也具有意义。

    正则表达式语法同常用小括号表示子表达式。

    eg: 可以使用子表达式来匹配文件扩展名

    regex r("([[:alnum:]]+)\\.(cpp|cxx|cc)$");

    现在模式中有两个小括号表示的子表达式:

    • ([[:alnum:]]+) 匹配一个或多个数字字母序列

    • (cpp|cxx|cc) 匹配cpp或cxx或cc等扩展名

    通过使用str(n)来打印子表达式

    if (regex_search(filename, results, r))cout << results.str(1) << endl;//打印第一个子表达式

    参数0代表整个对应的匹配,参数1表示第一个子表达式。

    如,foo.cpp中,results.str(0)将保存foo.cpp,results.str(1)将保存foo。

    子表达式用于数据验证

    子表达式的一个常见用途是验证必须匹配特定格式的数据。

    eg:匹配联通号码

    中国联通号段:130、131、132、145、155、156、166、175、176、185、186、196

    使用开源工具Regulex实现正则表达式设计可视化。

    C++怎么使用正则表达式

    void test02(){//匹配联通号码string UnicomNumber("\\b(1)(3[0-2]|[4578]5|[5-9]6)(\\d{4})(\\d{4})\\b");regex r(UnicomNumber);string testNumbers("130123456789 23112345678 7602125 1320000 16512345678 14512345678 17612345678");for (sregex_iterator it(testNumbers.begin(), testNumbers.end(), r), end_it;it != end_it;++it) {cout << it->str() << endl;}}

    结果:

    1451234567817612345678

    解释:

    在模式UnicomNumber中,有4个子表达式

    子表达式索引号子表达式含义
    子表达式1(1)匹配1
    子表达式2(3[0-2]|[4578]5|[5-9]6)匹配30/31/32/45/55/75/85/56/66/76/86/96
    子表达式3(\d{4})匹配任意4个数字
    子表达式4(\d{4})匹配任意4个数字

    此外,"\b"匹配单词边界,可以理解为空格与单词的分界线。"\d"匹配任意数字。[]内表示多选一,{n}表示匹配n个,子表达式内"|"表示或。

    并且,在正则表达式语法中"\“具有转义作用,在C++中也有转义作用,因此,为了得到正则表达式中的”\",需要在string中额外加一个"\"。所以我们的表达式中会有"\\b"和"\\d"。

    在正则匹配过程中,迭代器查找每一个号码,进行分析

    号码分析
    130123456789多了一位数字,单词边界匹配失败
    23112345678子表达式1匹配失败
    7602125子表达式1匹配失败
    1320000子表达式3匹配失败(或者说是边界匹配失败?)
    16512345678子表达式2匹配失败
    14512345678匹配成功
    17612345678匹配成功

    子匹配操作

    ssub_match的相关操作

     解释
    matched一个public bool成员,指出此ssub_match是否匹配了
    first,secondpublic数据成员,指向匹配序列首元素和尾后迭代器
    length()匹配的大小
    str()匹配的string
    s = ssub将ssub_match对象转化为string对象

    添加一段代码,测试一下matched成员

    for (sregex_iterator it(testNumbers.begin(), testNumbers.end(), r), end_it;it != end_it;++it) {cout << it->str() << endl;cout << "\t" << (*it)[4].matched << endl;}

    结果

    14512345678
            1
    17612345678
            1

    这里的matched为true表示匹配到了,当然,UnicomNumber的子表达式并非是可选匹配的(用"?"跟在一个表达式后表示可以有1个或0个该表达式),所以它的四个子表达式全部匹配到了,若是可选表达式,可能会出现matched为false的情况。

    regex_replace

    正则表达式不仅用在查找给定序列方面,当我们想将查找到的序列替换为另一个序列时,可使用regex_replace。

    eg:格式化输出电话号码

    void test03(){string UnicomNumber("\\b(1)(3[0-2]|[4578]5|[5-9]6)(\\d{4})(\\d{4})\\b");regex r(UnicomNumber);string fmt = "$1$2 $3 $4";string number = "14512345678";cout << regex_replace(number,r,fmt) << endl;}

    结果:

    145 1234 5678

    解释:

    使用"$"后跟子表达式的索引号来表示一个特定的子表达式。

    在"$1$2 $3 $4"中,希望子表达式1和2在一起,跟子表达式3和4之间都使用空格(" ")隔开。

    以上就是“C++怎么使用正则表达式”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    C++怎么使用正则表达式

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

    下载Word文档

    猜你喜欢

    C++怎么使用正则表达式

    今天小编给大家分享一下C++怎么使用正则表达式的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。目正则表达式正则表达式(regu
    2023-06-30

    C++11正则表达式库怎么使用

    本篇内容介绍了“C++11正则表达式库怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!基本用法代码说明最基本的用法当然就是定义正则表达
    2023-06-19

    C#正则表达式Regex类怎么使用

    这篇文章主要介绍“C#正则表达式Regex类怎么使用”,在日常操作中,相信很多人在C#正则表达式Regex类怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#正则表达式Regex类怎么使用”的疑惑有所
    2023-06-22

    c++正则表达式怎么应用

    今天小编给大家分享一下c++正则表达式怎么应用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1.正则表达式的需求1.检查一个
    2023-07-06

    在python正则表达式中是怎样正确使用正则表达式

    这篇文章将为大家详细讲解有关在python正则表达式中是怎样正确使用正则表达式,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。现在我们已经看了一些简单的正则表达式,那么我们实际在 Python
    2023-06-17

    js 怎么使用正则表达式

    在 JavaScript 中,可以使用正则表达式的两种方式:使用 RegExp 对象或者使用正则表达式字面量。1. 使用 RegExp 对象:```javascriptvar pattern = new RegExp("pattern");
    2023-09-20

    Ruby正则表达式怎么使用

    这篇文章主要介绍了Ruby正则表达式怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Ruby正则表达式怎么使用文章都会有所收获,下面我们一起来看看吧。Ruby 正则表达式正则表达式是一种特殊序列的字符,它
    2023-07-06

    pcre正则表达式怎么使用

    PCRE正则表达式的使用可以分为两个步骤:编译和匹配。1. 编译正则表达式:可以使用`preg_compile()`函数来编译一个正则表达式。例如:```php$pattern = '/\b[A-Za-z]+\b/';$regex = pr
    2023-09-29

    C#正则表达式怎么理解

    这篇文章主要讲解了“C#正则表达式怎么理解”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#正则表达式怎么理解”吧!到目前为止,许多的编程语言和工具都包含对正则表达式的支持,当然.NET也不
    2023-06-17

    C#中如何使用正则表达式

    C#中如何使用正则表达式,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。***个:验证输入的字符串是否为数字/// /// 验证输入字符串为数字 //
    2023-06-17

    正则表达式工具怎么使用

    使用正则表达式工具可以按照以下步骤进行:选择一个正则表达式工具:首先,你需要选择一个适合你需求的正则表达式工具。你可以选择在线工具,如Regex101、RegExr,或者使用文本编辑器插件,如Sublime Text、Visual Stud
    2023-07-10

    C#正则表达式的定位字符怎么使用

    这篇文章主要介绍“C#正则表达式的定位字符怎么使用”,在日常操作中,相信很多人在C#正则表达式的定位字符怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#正则表达式的定位字符怎么使用”的疑惑有所帮助!
    2023-06-18

    VB.NET正则表达式怎么用

    小编给大家分享一下VB.NET正则表达式怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1、引言在通常的程序设计中,对字符串的操作是不可缺少的部分。例如,我们
    2023-06-17

    Flex正则表达式怎么用

    这篇文章主要为大家展示了“Flex正则表达式怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Flex正则表达式怎么用”这篇文章吧。Flex正则表达式学习一般来说各个开发环境或者语言对于Fle
    2023-06-17

    C++中的正则表达式如何使用

    这篇文章主要介绍了C++中的正则表达式如何使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++中的正则表达式如何使用文章都会有所收获,下面我们一起来看看吧。介绍C++ 正则表达式教程解释了 C++ 中正则表
    2023-06-30

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录