iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >c++正则表达式怎么应用
  • 472
分享到

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

2023-07-06 02:07:09 472人浏览 泡泡鱼
摘要

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

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

    1.正则表达式的需求

    检查一个串是否包含某种形式的子串;

    将匹配的子串替换

    从某个串中取出符合条件的子串。

    1.1普通字符

    普通字符包括没有显式指定为元字符的所有可打印和不可打印字符。这包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号。

    1.2特殊字符

    特殊字符是正则表达式里有特殊含义的字符,也是正则表达式的核心匹配语法。参见下表:

    特殊字符描述

    $

    匹配输入字符串的末尾位置
    *匹配前面的子表达零次或多次
    +匹配前面的子表达零次或多次
    [标记一个中括号表达式开始
    ?匹配前面子表达式零次或一次,或指明非贪婪限定符
    \

    将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如,n匹配字符n。\n 匹配换行符。序列\\匹配\字符,而\则匹配‘(·字符。

    ~匹配输人字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合
     
    {标记限定符表达式开始
    \|

    指明两项之间的一个选择

    补充:

    (,)标记一个子表达式的开始和结束位置,子表达式可以供以后使用

        .  :匹配前面除\n之外的任何单字符

    1.3限定字符

    限定符用来指定正则表达式的一个给定的组件必须要出现多少次才能满足匹配。见下表:

    字符描述
    *匹配前面的子表达式零次或多次。例如,foo* 能匹配 fo 以及 foooo。* 等价于 {0,}。
    +匹配前面的子表达式一次或多次。例如,foo+ 能匹配 foo 以及 foooo,但不能匹配 fo。+ 等价于 {1,}。
    匹配前面的子表达式零次或一次。例如,Your(s)? 可以匹配 Your 或 Yours 中的 Your 。? 等价于 {0,1}。
    {n}n 是一个非负整数。匹配确定的 n 次。例如,o{2} 不能匹配 for 中的 o,但是能匹配 foo 中的两个 o。
    {n,}n 是一个非负整数。至少匹配 n 次。例如,o{2,} 不能匹配 for 中的 o,但能匹配 foooooo 中的所有 o。o{1,} 等价于 o+。o{0,} 则等价于 o*。
    {n,m}m 和 n 均为非负整数,其中 n 小于等于 m。最少匹配 n 次且最多匹配 m 次。例如, o{1,3} 将匹配 foooooo 中的前三个 o。o{0,1} 等价于 o?。注意,在逗号和两个数之 间不能有空格。

    2 std::regex极其相关

    2.1regex_match

    对字符串内容进行匹配的最常见手段就是使用正则表达式。可惜在传统 C++ 中正则表达式一直没 有得到语言层面的支持,没有纳入标准库,而 C++ 作为一门高性能语言,在后台服务的开发中,对 URL 资源链接进行判断时,使用正则表达式也是工业界最为成熟的普遍做法。

    C++11 提供的正则表达式库操作 std::string 对象,模式 std::regex (本质是 std::basic_regex) 进行初始化,通过 std::regex_match 进行匹配,从而产生 std::smatch(本质是 std::match_results 对象)。

    我们通过一个简单的例子来简单介绍这个库的使用。考虑下面的正则表达式:

    [a-z]+\.txt: 在这个正则表达式中, [a-z] 表示匹配一个小写字母, + 可以使前面的表达式匹配多 次,因此 [a-z]+ 能够匹配一个小写字母组成的字符串。在正则表达式中一个 . 表示匹配任意字 符,而 \. 则表示匹配字符 .,最后的 txt 表示严格匹配 txt 则三个字母。因此这个正则表达式的 所要匹配的内容就是由纯小写字母组成的文本文件。

    std::regex_match 用于匹配字符串和正则表达式,有很多不同的重载形式。最简单的一个形式就是 传入 std::string 以及一个 std::regex 进行匹配,当匹配成功时,会返回 true,否则返回 false。例 如:

    #include <iOStream>#include <string>#include <regex>int main() {std::string fnames[] = {"foo.txt", "bar.txt", "test", "a0.txt", "AAA.txt"};// 在 C++ 中 \ 会被作为字符串内的转义符,为使 \. 作为正则表达式传递进去生效,需要对 \ 进行二次转义,从而有 \\.std::regex txt_regex("[a-z]+\\.txt");for (const auto &fname: fnames)std::cout << fname << ": " << std::regex_match(fname, txt_regex) << std::endl;}

    结果:
    foo.txt: 1
    bar.txt: 1
    test: 0
    a0.txt: 0
    AAA.txt: 0

     另一种常用的形式就是依次传入 std::string/std::smatch/std::regex 三个参数,其中 std::smatch 的本质其实是 std::match_results。在标准库中,std::smatch 被定义为了 std::match_results, 也就是一个子串迭代器类型的 match_results。使用 std::smatch 可以方便的对匹配的结果进行获取

    #include<iostream>#include<string>#include<regex> int main(){    std::string fnames[] = {"foo.txt", "bar.txt", "test", "a0.txt", "AAA.txt"};// 在 C++ 中 \ 会被作为字符串内的转义符,为使 \. 作为正则表达式传递进去生效,需要    std::regex base_regex("([a-z]+)\\.txt");    std::match_results<std::string::const_iterator> base_match;    for(const auto& fname : fnames)    {        if(std::regex_match(fname,base_match,base_regex))        {            // std::smatch 的第一个元素匹配整个字符串            // std::smatch 的第二个元素匹配了第一个括号表达            if (base_match.size() == 2){            std::string base = base_match[1].str();            std::cout << "sub-match[0]: " << base_match[0].str() << std::endl;            std::cout << fname << " sub-match[1]: " << base << std::endl;            }          }    }}

    sub-match[0]: foo.txt foo.txt

    sub-match[1]: foo

    sub-match[0]: bar.txt bar.txt

    sub-match[1]: bar

    2.2regex_replace and regex_search

    regex_search:搜索匹配,即搜索字符串中存在符合规则的子字符串。
    regex_replace: 替换匹配,即可以将符合匹配规则的子字符串替换为其他字符串。(会改变字符串本身)

    测试代码   regex_search:

    #include<regex>#include<string>#include<iostream>int main() {std::string str = "hello2012-12-12world!!!!!";std::match_results<std::string::const_iterator> match;std::regex pattern("(\\d{4})-(\\d{1,2})-(\\d{1,2})"); if (std::regex_search(str,match,pattern)){for (size_t i = 1; i < match.size(); ++i){std::cout << match[i] <<std:: endl;}}return 0;}//20121212

    测试代码:regex_replace

    #include<regex>#include<string>#include<iostream>using namespace std;  int main() {    string str = "2019-08-07"; cout << regex_replace(str, regex("-"), "/") << endl;cout << str << endl;return 0; }

    3 常用的regex

    3.1检验数字表达式

    数字 : ^[0-9]*$
    n 位的数字 : ^\d{n}$
    至少 n 位的数字 : ^\d{n,}$
    m-n 位的数字 : ^\d{m,n}$
    零和非零开头的数字 : ^(0|[1-9][0-9]*)$
    非零开头的最多带两位小数的数字 : ^([1-9][0-9]*)+(.[0-9]{1,2})?$
    带 1~2 位小数的正数或负数 : ^(\-)?\d+(\.\d{1,2})?$
    正数 , 负数 , 和小数 : ^(\-|\+)?\d+(\.\d+)?$
    有两位小数的正实数 : ^[0-9]+(.[0-9]{2})?$
    有 1~3 位小数的正实数 : ^[0-9]+(.[0-9]{1,3})?$
    非零的正整数 : ^[1-9]\d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^\+?[1-9][0-9]*$
    非零的负整数 : ^\-[1-9][]0-9&Prime;*$ 或 ^-[1-9]\d*$
    非负整数 : ^\d+$ 或 ^[1-9]\d*|0$
    非正整数 : ^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$
    非负浮点数 : ^\d+(\.\d+)?$ 或 ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$
    非正浮点数 : ^((-\d+(\.\d+)?)|(0+(\.0+)?))$ 或 ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$
    正浮点数 : ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ 或 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$
    负浮点数 : ^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ 或 ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$
    浮点数 : ^(-?\d+)(\.\d+)?$ 或 ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$

    3.2检验字符串表达式

    汉字 : ^[\u4e00-\u9fa5]{0,}$
    英文和数字 : ^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$
    长度为 3~20 的所有字符 : ^.{3,20}$
    由 26 个英文字母组成的字符串 : ^[A-Za-z]+$
    由 26 个大写英文字母组成的字符串 : ^[A-Z]+$
    由 26 个小写英文字母组成的字符串 : ^[a-z]+$
    由数字和 26 个英文字母组成的字符串 : ^[A-Za-z0-9]+$
    由数字 , 26 个英文字母或者下划线组成的字符串 : ^\w+$ 或 ^\w{3,20}$
    中文 , 英文 , 数字包括下划线 : ^[\u4E00-\u9FA5A-Za-z0-9_]+$
    中文 , 英文 , 数字但不包括下划线等符号 : ^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$
    可以输入含有^%&',;=?$\"等字符 : [^%&',;=?$\x22]+
    禁止输入含有 ~ 的字符 : [^~\x22]+
     

    3.3检验特殊表达式

    Email 地址 : ^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
    域名 : [a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?
    InternetURL : [a-zA-z]+://[^\s]* 或 ^Http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$
    手机号码 : ^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$
    电话号码("XXX-XXXXXXX" , "XXXX-XXXXXXXX" , "XXX-XXXXXXX" , "XXX-XXXXXXXX" , "XXXXXXX"和"XXXXXXXX) : ^($$\d{3,4}-)|\d{3.4}-)?\d{7,8}$
    国内电话号码 (0511-4405222 , 021-87888822) : \d{3}-\d{8}|\d{4}-\d{7}
    身份证号 (15 位 , 18 位数字) : ^\d{15}|\d{18}$
    短身份证号码 (数字 , 字母 x 结尾) : ^([0-9]){7,18}(x|X)?$ 或 ^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$
    帐号是否合法(字母开头,允许 5~16 字节,允许字母数字下划线) : ^[a-zA-Z][a-zA-Z0-9_]{4,15}$
    密码 (以字母开头,长度在 6~18 之间,只能包含字母 , 数字和下划线) : ^[a-zA-Z]\w{5,17}$
    强密码 (必须包含大小写字母和数字的组合,不能使用特殊字符,长度在 8~10 之间) : ^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$
    日期格式 : ^\d{4}-\d{1,2}-\d{1,2}
    一年的 12 个月(01~09和1~12) : ^(0?[1-9]|1[0-2])$
    一个月的 31 天(01~09和1~31) : ^((0?[1-9])|((1|2)[0-9])|30|31)$

     

    注意:

    在C++中,对于特殊字符,需要使用转义字符. 因此,匹配数字的\d,需要写成\d这种格式.

    经典的三部曲匹配:

    先写pattern. string pattern = {“XXXX”};

    使用re. regex re(pattern);

    match. bool rs = regex_match(mobile, re);

    regex_match在匹配一次后即返回结果,如果期望进行多次匹配,需要用到regex_iterator.std::regex_iterator<std::string::iterator> rit(result.begin(), result.end(), re); 匹配结果的输出可以利用cmatch.regex_match(rit->str().c_str(), cm, re);这里面cm的内容与正则表达式pattern是对应匹配的. 具体可参考matchPriceInfo方法.

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

    --结束END--

    本文标题: c++正则表达式怎么应用

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

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

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

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

    下载Word文档
    猜你喜欢
    • c++正则表达式怎么应用
      今天小编给大家分享一下c++正则表达式怎么应用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1.正则表达式的需求检查一个串是...
      99+
      2023-07-06
    • C++怎么使用正则表达式
      今天小编给大家分享一下C++怎么使用正则表达式的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。目正则表达式正则表达式(regu...
      99+
      2023-06-30
    • go正则表达式怎么应用
      正则表达式是一种用于匹配字符串模式的工具,可以在多种编程语言中应用。以下是一个简单的例子,展示了在Python中如何使用正则表达式进...
      99+
      2023-10-09
      go
    • C#正则表达式语法的应用
      这篇文章主要介绍“C#正则表达式语法的应用”,在日常操作中,相信很多人在C#正则表达式语法的应用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#正则表达式语法的应用”的疑惑有所帮助!接下来,请跟着小编一起来...
      99+
      2023-06-17
    • C++ 正则表达式的应用详解
      目录一、为什么要学正则表达式C++string处理:二、正则程序库(regex)正则文法:正则库:匹配(Match)搜索(Search)替换(Replace)一、为什么要学正则表达式...
      99+
      2024-04-02
    • C#使用正则表达式
      一.正则基础 1. []方括号表示匹配可以匹配方括号中的任意点单个字符,方括号只允许匹配单个字符。2. | 或表示两项之间的一个选择,它不能和方括号使用,只能和小括号使用。3. ()...
      99+
      2024-04-02
    • C#正则表达式怎么理解
      这篇文章主要讲解了“C#正则表达式怎么理解”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#正则表达式怎么理解”吧!到目前为止,许多的编程语言和工具都包含对正则表达式的支持,当然.NET也不...
      99+
      2023-06-17
    • C#正则表达式Regex类怎么使用
      这篇文章主要介绍“C#正则表达式Regex类怎么使用”,在日常操作中,相信很多人在C#正则表达式Regex类怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#正则表达式Regex类怎么使用”的疑惑有所...
      99+
      2023-06-22
    • JavaScript中的正则表达式怎么应用
      本篇内容主要讲解“JavaScript中的正则表达式怎么应用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript中的正则表达式怎么应用”吧!  正则表达式(regular expr...
      99+
      2023-06-03
    • C++11正则表达式库怎么使用
      本篇内容介绍了“C++11正则表达式库怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!基本用法代码说明最基本的用法当然就是定义正则表达...
      99+
      2023-06-19
    • C#正则表达式大全
      目录一、简介字符转义 字符类分组构造限定符二、C#常用正则表达式符号大全三、代码一、简介 正则表达式是一种匹配输入文本的模式,.Net 框架提供了允许这种匹配的正则表达式引...
      99+
      2024-04-02
    • JavaScript正则表达式怎么用
      这篇文章主要为大家展示了“JavaScript正则表达式怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JavaScript正则表达式怎么用”这篇文章吧。什...
      99+
      2024-04-02
    • Oracle正则表达式怎么用
      这篇文章给大家分享的是有关Oracle正则表达式怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。oracle正则表达式 ORACLE中的支持正则表达式的函数主要有下面四个: ...
      99+
      2024-04-02
    • VB.NET正则表达式怎么用
      小编给大家分享一下VB.NET正则表达式怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1、引言在通常的程序设计中,对字符串的操作是不可缺少的部分。例如,我们...
      99+
      2023-06-17
    • Shell正则表达式怎么用
      这篇文章将为大家详细讲解有关Shell正则表达式怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、正则表达式是什么?正则表达式是用于描述字符排列和匹配模式的一种语法规则。它主要用于字符串的模式分割、...
      99+
      2023-06-09
    • Flex正则表达式怎么用
      这篇文章主要为大家展示了“Flex正则表达式怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Flex正则表达式怎么用”这篇文章吧。Flex正则表达式学习一般来说各个开发环境或者语言对于Fle...
      99+
      2023-06-17
    • 在python正则表达式中是怎样正确使用正则表达式
      这篇文章将为大家详细讲解有关在python正则表达式中是怎样正确使用正则表达式,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。现在我们已经看了一些简单的正则表达式,那么我们实际在 Python...
      99+
      2023-06-17
    • 正则表达式
      2019-01-16 作用 :     路由匹配,表单信息的验证  (字符串匹配) 信息提取(在大段文本中提取信息,爬虫) 字符串的提取和校验 []在中括号内匹配任意项  [^]不匹配中括号中的任意一项    [0-9]  0123......
      99+
      2023-01-30
      正则表达式
    • Python中怎么使用正则表达式及正则表达式匹配规则是什么
      1 导库import re2 使用模板re_pattern = re.compile(pattern, flags=0) result = re.findall(re_pattern,string)3 说明参数描述pattern匹配的正则表...
      99+
      2023-05-14
      Python
    • Oracle中正则表达式怎么用
      小编给大家分享一下Oracle中正则表达式怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Oracle使用正则表达式离不开这...
      99+
      2024-04-02
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作