「C/C++」C/C++搭建程序框架

在这里插入图片描述

✨博客主页
何曾参静谧的博客
文章专栏
「C/C++」C/C++程序设计
全部专栏
「UG/NX」NX二次开发 「UG/NX」BlockUI集合
「VS」Visual Studio 「QT」QT5程序设计
「C/C++」C/C++程序设计 「Win」Windows程序设计
「DSA」数据结构与算法 「File」数据文件格式

目录

  • 术语介绍
  • 匹配代码
    • 常用标识
    • 转义字符
    • 贪婪与懒惰
  • 常用匹配举例
    • 1. 验证输入数据的格式:
    • 2. 提取文本中的特定信息:
    • 3. 替换文本中的特定模式:
    • 4. 分割文本为不同的单词或句子:
  • C++标准库#include
    • 1. `std::regex`
    • 2. `std::regex_match`
    • 3. `std::regex_search`
    • 4. `std::regex_replace`
    • 5. `std::sregex_iterator`
  • 参考文献


术语介绍

正则表达式说明:

  • 正则表达式:是一种用于描述和匹配字符串模式的工具。

正则表达式功能:

  • 模式匹配:检查一个字符串是否与指定模式匹配。
  • 字符串搜索和替换:在一个文本中搜索并替换符合规则的字符序列。
  • 字符串分割:根据模式将字符串切分成多个部分。
  • 校验输入:对用户输入进行验证,以确保其符合特定格式要求。
  • 数据提取:从字符串中抽取特定的信息、数据或属性。

在线正则表达式测试工具【英文】:https://regex101.com/
在线正则表达式测试工具【中文】:https://regexr-cn.com/
在线正则表达式练习工具:https://www.codejiaonang.com/#/courses
在线正则表达式说明工具:https://r2coding.com

匹配代码

常用标识

字符标识 含义
. 除换行符外的任意字符
* 前面的子表达式零次或多次
+ 前面的子表达式一次或多次
? 前面的子表达式零次或一次
| 或运算符。并集,可以匹配符号前后的表达式。
[] 匹配方括号中列举的任意一个字符
[^] 匹配除了方括号中列举的任意一个字符以外的任意字符
() 捕获组,用于分组和提取匹配结果
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次
\d 任意一个数字字符(0-9)
\D 任意一个非数字字符
\w 任意一个单词字符(字母、数字、“_”)
\W 任意一个非单词字符
\s 任意一个空白字符(空格、制表符、换行符等)
\S 任意一个非空白字符
\b 单词边界
\B 非单词边界
^ 行的开头(或在 [] 中表示取反)
$ 行的结尾
\ 转义字符,用于转义特殊字符

转义字符

转义字符 说明
\n 换行
\t 横向跳格(制表符)
\v 竖向跳格
\b 退格
\r 回车
\f 走纸换页
\\ 反斜杠字符 \
\' 单引号字符
\a 鸣玲
\ddd 1到3位八进制数所代表的字符
​​\xhh 以十六进制表示的字符(例如,​\x41​ 表示大写字母 ‘A’)
​​\uhhhh ​ 以十六进制表示的 Unicode 字符(例如,​\u0041​ 表示大写字母 ‘A’)
​​\Uhhhhhhhh 以十六进制表示的长形式 Unicode 字符

贪婪与懒惰

代码 说明
*? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复

常用匹配举例

1. 验证输入数据的格式:

  • 邮箱地址:^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
  • 网络地址:^(?:https?:\/\/)?[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(?:\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+$
  • 手机号码:/^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$/gm
  • 身份证号码:^[1-9]\\d{5}(18|19|20)\\d{2}(0\\d|10|11|12)([0-2]\\d|30|31)\\d{3}[0-9Xx]$

2. 提取文本中的特定信息:

  • 匹配HTML标签中的内容:<([a-zA-Z]+)(?:\\s+[a-zA-Z]+=\"[^\"]*\")*>\\s*([\\w\\W]*?)\\s*
  • 匹配URL中的域名:(https?|ftp)://([\\w_-]+(\\.[\\w_-]+)+)(:[0-9]+)?(/\\S*)?

3. 替换文本中的特定模式:

  • 将日期格式从"YYYY/MM/DD"替换为"DD-MM-YYYY":(\d{4})/(\d{2})/(\d{2}) 替换为 \3-\2-\1
  • 删除多余的连续空白字符:\s+ 替换为空格

4. 分割文本为不同的单词或句子:

  • 以逗号和空格分割句子:\\s*,\\s*

C++标准库#include

所属头文件:#include

组件名称 作用
std::regex 表示一个正则表达式的对象
std::regex_match 将一个字符序列与正则表达式进行完全匹配
std::regex_search 在字符序列中搜索满足正则表达式的第一个子序列
std::regex_replace 使用给定的格式替换字符串中满足正则表达式的部分
std::sregex_iterator 迭代器适配器,用于遍历字符串中所有与正则表达式匹配的子序列
std::smatch 存储与正则表达式匹配的结果的容器类
std::ssub_match 存储在字符串中与子表达式匹配的结果的容器类

1. std::regex

#include 
#include 

int main() {
    std::string input = "Hello, World!";
    std::regex pattern("Hello");

    if (std::regex_match(input, pattern)) {
        std::cout << "Pattern matched." << std::endl;
    } else {
        std::cout << "Pattern not matched." << std::endl;
    }

    return 0;
}

2. std::regex_match

#include 
#include 

int main() {
    std::string input = "1234";
    std::regex pattern("\\d+");

    if (std::regex_match(input, pattern)) {
        std::cout << "Input string matches the pattern." << std::endl;
    } else {
        std::cout << "Input string does not match the pattern." << std::endl;
    }

    return 0;
}

3. std::regex_search

#include 
#include 

int main() {
    std::string input = "Hello, World!";
    std::regex pattern("World");

    std::smatch match;
    if (std::regex_search(input, match, pattern)) {
        std::cout << "Pattern found: " << match.str() << std::endl;
    } else {
        std::cout << "Pattern not found." << std::endl;
    }

    return 0;
}

4. std::regex_replace

#include 
#include 

int main() {
    std::string input = "Hello, World!";
    std::regex pattern("World");

    std::string replaced = std::regex_replace(input, pattern, "Universe");
    std::cout << "Replaced string: " << replaced << std::endl;

    return 0;
}

5. std::sregex_iterator

#include 
#include 

int main() {
    std::string input = "Hello, 2021! This is a sample string with numbers 1234.";

    std::regex pattern("\\d+");
    std::sregex_iterator iter(input.begin(), input.end(), pattern);
    std::sregex_iterator end;

    std::cout << "Matches found: ";
    for (; iter != end; ++iter) {
        std::cout << iter->str() << " ";
    }
    std::cout << std::endl;

    return 0;
}

参考文献

正则表达式30分钟入门教程——作者:deerchao
微软.NET正则表达式

在这里插入图片描述

你可能感兴趣的:(c语言,c++,正则表达式)