2023-4-26-C++11新特性之正则表达式

简介: 2023-4-26-C++11新特性之正则表达式

😉一、正则表达式的概念

正则表达式(Regular Expression,常简写为regex、regexp或RE)。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。C++11开始支持正则表达式。

正则表达式非常强大,具体的实现算法有差异,所以会有多种实现方式。C++11支持6种正则表达式引擎。ECMAScript 是其中支持最多元素的引擎,也是regex默认支持的引擎。

  • ECMAScript
  • basic(POSIX Basic Regular Expressions)
  • extended(POSIX Extended Regular Expressions )
  • awk(POSIX awk)
  • grep(POSIX grep )
  • egrep(POSIX grep –E)

正则表达式主要两部分构成,特殊字符和普通字符。

字符 描述
\ 转义字符
$ 匹配字符行尾
* 匹配前面的子表达式任意多次
+ 匹配前面的子表达式一次或多次
匹配前面的子表达式零次或一次
{m} 匹配确定的m次
{m,} 匹配至少m次
{m,n} {m,n}
. 匹配任意字符
x y
[xyz] 字符集合,匹配包含的任意一个字符
[^xyz] 匹配未包含的任意字符
[a-z] 字符范围,匹配指定范围内的任意字符
[^a-z] 匹配任何不在指定范围内的任意字符
字符 描述
\w 匹配字母或数字或下划线,任意一个字母或数字或下划线,即AZ,az,0~9,_中任意一个
\W 匹配任意不是字母、数字、下划线的字符
\s 匹配任意的空白符,包括空格、制表符、换页符等空白字符的其中任意一个,与”[ \f\n\r\t\v]”等效
\S 匹配任意不是空白符的字符,与”[^\f\n\r\t\v]”等效
\d 匹配数字,任意一个数字,0~9中的任意一个,等效于”[0-9]”
\D 匹配任意非数字的字符,等效于”[^0-9]”
\b 匹配一个字边界,即字与空格间的位置,也就是单词和空格之间的位置,不匹配任何字符,如,“er\b"匹配"never"中的"er”,但不匹配"verb"中的"er"
\B 非字边界匹配,“er\B"匹配"verb"中的"er”,但不匹配"never"中的"er"
\f 匹配一个换页符,等价于”\x0c”和”\cL”
\n 匹配一个换行符,等价于”\x0a”和”\cJ”
\r 匹配一个回车符,等价于”\x0d”和”\cM”
\t 匹配一个制表符,等价于”\x09”和”\cI”
\v 匹配一个垂直制表符,等价于”\x0b”和”\cK”
\cx 匹配”x”指示的控制字符,如,\cM匹配Control-M或回车符,”x”的值必须在”A-Z”或”a-z”之间,如果不是这样,则假定c就是"c"字符本身

regex_match

全文匹配,即要求整个字符串符合匹配规则,返回true或false

#include "iostream"
#include "regex"
using namespace std;
int main() {
    std::string str="1111-1";
    cout<<std::regex_match(str,regex("\\d{4}-\\d{1,2}"))<<endl;//匹配”四个数字-一个或两个数字“,返回值为1匹配成功
    str="1320550505@qq.com";
    cout<<regex_match(str,regex("\\d{1,}@qq.com"))<<endl;//匹配”QQ邮箱“,返回值为1匹配成功
    return 0;
}

regex_search

搜索匹配,即搜索字符串中存在符合规则的子字符串。

#include "iostream"
#include "regex"
using namespace std;
int main() {
    string str= "hello2019-02-03word";
    smatch match;
    regex regex1("(\\d{4})-(\\d{1,2})-(\\d{1,2})");//搜索规则()表示把内容拿出来,不加()的话只有match[0],没有[1][2][3]
    std::cout<<regex_search(str,match,regex1);//找到了返回1
    std::cout<<match[0];//2019-02-03
    std::cout<<match[1];//2019
    std::cout<<match[2];//02
    std::cout<<match[3];//03
    return 0;
}
#include "iostream"
#include "regex"
using namespace std;
int main() {
    string str = "hello2019-02-03word,hello2019-02-03word,hello2019-02-03word    ";
    smatch match;
    regex regex1("(\\d{4})-(\\d{1,2})-(\\d{1,2})");//搜索规则()表示把内容拿出来,不加()的话只有match[0],没有[1][2][3]
    string::const_iterator citer = str.cbegin();
    while (regex_search(citer, str.cend(), match, regex1)) {
        citer = match[0].second;//将迭代器的指针指向匹配到的字符串后面的位置
        for (size_t i = 1; i < match.size(); i++) {
            cout << match[i] << " ";//把三个括号里面的内容拿出来
        }
        cout << endl;
    }
    return 0;
}

regex_replace

替换匹配,即可以将符合匹配规则的子字符串替换为其他字符串。

#include "iostream"
#include "regex"
using namespace std;
int main() {
    string str = "hello2019-02-03word,hello2019-02-03word,hello2019-02-03word";
    regex regex1("-");
    cout << regex_replace(str, regex1, "/") << endl;//hello2019/02/03word,hello2019/02/03word,hello2019/02/03word,函数的返回值就是代替之后的结果
    return 0;
}

🧊文章总结

提示:这里对文章进行总结:

  本文讲了关于正则表达式的书写,自己写一遍就会发现很简单,学到就是赚到


目录
相关文章
|
4月前
|
C语言 C++ 开发者
深入探索C++:特性、代码实践及流程图解析
深入探索C++:特性、代码实践及流程图解析
|
4月前
|
算法 数据处理 C++
【C++ 20 新特性 算法和迭代器库的扩展和泛化 Ranges】深入浅出C++ Ranges库 (Exploring the C++ Ranges Library)
【C++ 20 新特性 算法和迭代器库的扩展和泛化 Ranges】深入浅出C++ Ranges库 (Exploring the C++ Ranges Library)
601 1
|
3月前
|
编译器 C++ 开发者
C++一分钟之-C++20新特性:模块化编程
【6月更文挑战第27天】C++20引入模块化编程,缓解`#include`带来的编译时间长和头文件管理难题。模块由接口(`.cppm`)和实现(`.cpp`)组成,使用`import`导入。常见问题包括兼容性、设计不当、暴露私有细节和编译器支持。避免这些问题需分阶段迁移、合理设计、明确接口和关注编译器更新。示例展示了模块定义和使用,提升代码组织和维护性。随着编译器支持加强,模块化将成为C++标准的关键特性。
167 3
|
3月前
|
编译器 C语言 C++
C++一分钟之-C++11新特性:初始化列表
【6月更文挑战第21天】C++11的初始化列表增强语言表现力,简化对象构造,特别是在处理容器和数组时。它允许直接初始化成员变量,提升代码清晰度和性能。使用时要注意无默认构造函数可能导致编译错误,成员初始化顺序应与声明顺序一致,且在重载构造函数时避免歧义。利用编译器警告能帮助避免陷阱。初始化列表是高效编程的关键,但需谨慎使用。
50 2
|
1月前
|
安全 NoSQL Redis
C++新特性-智能指针
C++新特性-智能指针
|
2月前
|
数据安全/隐私保护 C++
|
3月前
|
安全 JavaScript 前端开发
C++一分钟之-C++17特性:结构化绑定
【6月更文挑战第26天】C++17引入了结构化绑定,简化了从聚合类型如`std::tuple`、`std::array`和自定义结构体中解构数据。它允许直接将复合数据类型的元素绑定到单独变量,提高代码可读性。例如,可以从`std::tuple`中直接解构并绑定到变量,无需`std::get`。结构化绑定适用于处理`std::tuple`、`std::pair`,自定义结构体,甚至在范围for循环中解构容器元素。注意,绑定顺序必须与元素顺序匹配,考虑是否使用`const`和`&`,以及谨慎处理匿名类型。通过实例展示了如何解构嵌套结构体和元组,结构化绑定提升了代码的简洁性和效率。
70 5
|
2月前
|
存储 C++ 容器
C++一分钟之-正则表达式库(regex)
【7月更文挑战第7天】C++从C++11开始支持正则表达式,通过`&lt;regex&gt;`库提供功能。本文涵盖基本概念如`std::regex`、`std::smatch`,以及`regex_search`和`regex_match`的使用。常见问题包括大小写敏感性、特殊字符转义、贪婪与非贪婪匹配和捕获组。提供的代码示例展示了如何进行匹配、不区分大小写的匹配、特殊字符匹配、贪婪与非贪婪匹配和捕获组的使用。理解并练习正则表达式能提升文本处理效率。
39 0
|
2月前
|
存储 安全 编译器
|
4月前
|
自然语言处理 编译器 C语言
【C++】C++ 入门 — 命名空间,输入输出,函数新特性
本文章是我对C++学习的开始,很荣幸与大家一同进步。 首先我先介绍一下C++,C++是上个世纪为了解决软件危机所创立 的一项面向对象的编程语言(OOP思想)。
59 1
【C++】C++ 入门 — 命名空间,输入输出,函数新特性