[笔记]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

相关文章
|
1月前
|
存储 C++ 容器
学会在 C++ 中使用变量:从定义到实践
C++中的变量是数据容器,包括`int`、`double`、`char`、`string`和`bool`等类型。声明变量时指定类型和名称,如`int myNum = 15;`。`cout`与`&lt;&lt;`用于显示变量值。常量用`const`声明,值不可变。变量名应唯一,遵循特定命名规则,常量声明时需立即赋值。
113 1
|
1月前
|
存储 算法 编译器
【C++ 字符数组的模板特化】面向字符串的C++模板特化:理解与实践
【C++ 字符数组的模板特化】面向字符串的C++模板特化:理解与实践
47 1
|
1月前
|
算法 程序员 C语言
【C++ 随机数分布类型 】深入探索C++随机数分布:原理、应用与实践(二)
【C++ 随机数分布类型 】深入探索C++随机数分布:原理、应用与实践
56 0
【C++ 随机数分布类型 】深入探索C++随机数分布:原理、应用与实践(二)
|
1月前
|
算法 Java 编译器
【C++ 14新特性 】C++14 数字分隔符:深入理解与实践
【C++ 14新特性 】C++14 数字分隔符:深入理解与实践
54 2
|
1月前
|
存储 Linux 测试技术
无效数据处理之道:Linux系统编程C/C++实践探索(三)
无效数据处理之道:Linux系统编程C/C++实践探索
17 0
|
1月前
|
存储 安全 编译器
【C++ 17 新功能 std::visit 】深入解析 C++17 中的 std::visit:从原理到实践
【C++ 17 新功能 std::visit 】深入解析 C++17 中的 std::visit:从原理到实践
70 0
|
1月前
|
算法 网络协议 编译器
【C++ 14 新特性】C++14二进制字面量:深度探索与实践
【C++ 14 新特性】C++14二进制字面量:深度探索与实践
39 1
|
2天前
|
机器学习/深度学习 开发框架 人工智能
探索C++的深邃世界:编程语言的魅力与实践
探索C++的深邃世界:编程语言的魅力与实践
|
10天前
|
缓存 编译器 API
NumPy与其他语言(如C/C++)的接口实践
【4月更文挑战第17天】本文介绍了NumPy与C/C++的接口实践,包括Python与C/C++交互基础、NumPy的C API和Cython的使用。通过案例展示了如何将C++函数与NumPy数组结合,强调了内存管理、类型匹配、错误处理和性能优化的最佳实践。掌握这些技能对于跨语言交互和集成至关重要。
|
1月前
|
监控 Linux 编译器
Linux C++ 定时器任务接口深度解析: 从理论到实践
Linux C++ 定时器任务接口深度解析: 从理论到实践
70 2