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;
}

🧊文章总结

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

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


目录
相关文章
|
1月前
|
编译器 程序员 定位技术
C++ 20新特性之Concepts
在C++ 20之前,我们在编写泛型代码时,模板参数的约束往往通过复杂的SFINAE(Substitution Failure Is Not An Error)策略或繁琐的Traits类来实现。这不仅难以阅读,也非常容易出错,导致很多程序员在提及泛型编程时,总是心有余悸、脊背发凉。 在没有引入Concepts之前,我们只能依靠经验和技巧来解读编译器给出的错误信息,很容易陷入“类型迷路”。这就好比在没有GPS导航的年代,我们依靠复杂的地图和模糊的方向指示去一个陌生的地点,很容易迷路。而Concepts的引入,就像是给C++的模板系统安装了一个GPS导航仪
102 59
|
1月前
|
存储 编译器 C++
【C++】面向对象编程的三大特性:深入解析多态机制(三)
【C++】面向对象编程的三大特性:深入解析多态机制
|
1月前
|
存储 编译器 C++
【C++】面向对象编程的三大特性:深入解析多态机制(二)
【C++】面向对象编程的三大特性:深入解析多态机制
|
1月前
|
编译器 C++
【C++】面向对象编程的三大特性:深入解析多态机制(一)
【C++】面向对象编程的三大特性:深入解析多态机制
|
1月前
|
存储 安全 编译器
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值(一)
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值
|
24天前
|
C++
C++ 20新特性之结构化绑定
在C++ 20出现之前,当我们需要访问一个结构体或类的多个成员时,通常使用.或->操作符。对于复杂的数据结构,这种访问方式往往会显得冗长,也难以理解。C++ 20中引入的结构化绑定允许我们直接从一个聚合类型(比如:tuple、struct、class等)中提取出多个成员,并为它们分别命名。这一特性大大简化了对复杂数据结构的访问方式,使代码更加清晰、易读。
31 0
|
2月前
|
编译器 C++ 计算机视觉
C++ 11新特性之完美转发
C++ 11新特性之完美转发
47 4
|
2月前
|
Java C# C++
C++ 11新特性之语法甜点1
C++ 11新特性之语法甜点1
31 4
|
2月前
|
安全 程序员 编译器
C++ 11新特性之auto和decltype
C++ 11新特性之auto和decltype
38 3
|
2月前
|
设计模式 缓存 安全
C++ 11新特性之week_ptr
C++ 11新特性之week_ptr
33 2