[笔记]c++基础实践《二》regex正则表达式

C++ regex 正则表达式的使用

菜鸟教程 正则表达式

github

练习题

练习题2


前言

在c++中,有三种正则可以选择使用,C ++regex,POSIX regex,boost regex 如果在windows下开发c++,默认不支持后面两种正则,如果想快速应用,显然C++ regex 比较方便使用。文章将讨论C++
regex 正则表达式的使用。

  • c++ regex 通常匹配模式用 “()”
  • POSIX regex 通常匹配模式用 “[]”
  • boost regex 支持perl regular表达式、POSIX-Extended regular表达式和POSIX-Basic Regular表达式,但默认的表达式语法是perl语法,如果要使用其余两种语法需要在构造表达式的时候明确指定。

常用函数

regex_match

全词匹配

regex_search

搜索其中匹配的字符串

regex_search和regex_match区别

regex_match是全词匹配,而regex_search是搜索其中匹配的字符串。

regex_replace

替换正则表达式匹配内容的函数

正则表达式的规则

特殊字符

特殊字符(用于匹配很难形容的字符)

注:在C++反斜杠字符(\)会被转义
std::regex e1 (“\d”); // \d -> 匹配数字字符
std::regex e2 (“\\”); // \ -> 匹配反斜杠字符

数量

练习

1、匹配电话号码

题目:

J.Doe:248-555-1234

答案:
正则表达式:

[2-9]?\\d\\d-[2-9]{3}-[1-9]{4}
void test1() {
    std::string src = "J.Doe:248-555-1234";
    std::string pattern = "[2-9]?\\d\\d-[2-9]{3}-[1-9]{4}";
    
    std::regex model(pattern);
    std::smatch m;
    std::cout << "Src: " << src << std::endl;
    std::cout << "Expression: " << pattern << std::endl;
    std::cout << "Result:" << std::endl;

    while (std::regex_search(src, m, model)) {
        for (auto x = m.begin(); x != m.end(); x++) {
            std::cout << x->str() << "\n";
        }
        std::cout << "  pattern:" << pattern << " suffix:" << m.format("$2") << std::endl;
        src = m.suffix().str();
    }
}

2、匹配整数或者小数(包括正数和负数)

题目:

ad-10s-()#@a?.@../}[#{!d2.5678 4z^&*|?ss1a3.14ssd2q3.qq

匹配小数:
正则表达式:

\\d+\\.[0-9]+

匹配整数:
正则表达式:

\\d+

匹配负数:
正则表达式:

-\\d+(\\.\\d+)?

匹配整数或者小数(包括正数和负数):

-?[0-9]+(\\.[0-9]+)?
void test2() {
    std::string src = "ad-10s-()#@a?.@../}[#{!d2.5678 4z^&*|?ss1a3.14ssd2q3.qq-3.111-3....";
    

    //小数
    //std::string pattern = "\\d+\\.[0-9]+";

    //整数
    //std::string pattern = "\\d+";

    //负数
    //std::string pattern = "-\\d+(\\.\\d+)?";

    //
    std::string pattern = "-?[0-9]+(\\.[0-9]+)?";

    std::smatch m;
    std::regex model(pattern);

    std::cout << "Src: " << src << std::endl;
    std::cout << "Expression: " << pattern << std::endl;
    std::cout << "Result:" << std::endl;

    while (std::regex_search(src, m, model)) {
        for (auto x = m.begin(); x != m.end(); x++) {
            std::cout << x->str() << "\n";
        }
        std::cout << "  pattern:" << pattern << " suffix:" << m.format("$2") << std::endl;
        src = m.suffix().str();
    }
}

练习3、匹配出最内层小括号以及小括号内的表达式

1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))((1+11)+2)

1)从上面算式中匹配出最内层小括号以及小括号内的表达式

答案:
正则表达式:

\\([^()]+\\)
\\(坐标左括号起始 ,[^()]+ 表示 1-n个非‘(’和‘)’,\\)转义右括号结尾。
这里我在纠结[]里面的字符需要不需要转义\\ 貌似不影响。

练习4 匹配类似html标签内容

<a>wahaha</a>
<b>banana</b>
<h1>qqxing</h1>

这样的字符串中,
1)匹配出wahaha,banana,qqxing内容
答案:
正则表达式:

[^<>]+\\w+[^<>/]

2)匹配出a,b,h1这样的内容
答案:
正则表达式:

\\<\\w+\\>

\w 表示字母数字或者下划线

另一种类POSIX

总结

1、符号基本需要加\转义

2.[]{}()作用?

[]指定字符集合
{}数量范围
()子表达式
https://blog.csdn.net/gb4215287/article/details/110795148

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二进制怪兽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值