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

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

前言

在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

相关文章
|
17天前
|
机器学习/深度学习 缓存 JavaScript
简单粗暴的正则表达式笔记
简单粗暴的正则表达式笔记
73 25
|
2月前
|
存储 C++
【C++篇】C++类和对象实践篇——从零带你实现日期类的超详细指南
【C++篇】C++类和对象实践篇——从零带你实现日期类的超详细指南
33 2
【C++篇】C++类和对象实践篇——从零带你实现日期类的超详细指南
|
6月前
|
算法 C++
算法笔记:递归(c++实现)
算法笔记:递归(c++实现)
|
2月前
|
存储 编译器 C语言
C++类与对象深度解析(一):从抽象到实践的全面入门指南
C++类与对象深度解析(一):从抽象到实践的全面入门指南
53 8
|
6月前
|
编译器 C++
《Effective C++ 改善程序与设计的55个具体做法》 第一章 笔记
《Effective C++ 改善程序与设计的55个具体做法》 第一章 笔记
|
3月前
|
机器学习/深度学习 缓存 JavaScript
简单粗暴的正则表达式笔记
简单粗暴的正则表达式笔记
45 5
|
3月前
|
C++
c++继承层次结构实践
这篇文章通过多个示例代码,讲解了C++中继承层次结构的实践应用,包括多态、抽象类引用、基类调用派生类函数,以及基类指针引用派生类对象的情况,并提供了相关的参考链接。
|
4月前
|
C++ 容器
【C/C++笔记】迭代器
【C/C++笔记】迭代器
29 1
|
4月前
|
存储 安全 程序员
【C/C++笔记】迭代器范围
【C/C++笔记】迭代器范围
73 0
|
5月前
|
C++ Windows
FFmpeg开发笔记(三十九)给Visual Studio的C++工程集成FFmpeg
在Windows上使用Visual Studio 2022进行FFmpeg和SDL2集成开发,首先安装FFmpeg至E:\msys64\usr\local\ffmpeg,然后新建C++控制台项目。在项目属性中,添加FFmpeg和SDL2的头文件及库文件目录。接着配置链接器的附加依赖项,包括多个FFmpeg及SDL2的lib文件。在代码中引入FFmpeg的`av_log`函数输出"Hello World",编译并运行,若看到"Hello World",即表示集成成功。详细步骤可参考《FFmpeg开发实战:从零基础到短视频上线》。
220 0
FFmpeg开发笔记(三十九)给Visual Studio的C++工程集成FFmpeg