c++11之正则表达式

本文介绍了正则表达式的基本概念,展示了如何在C++中使用`regex_match`、`regex_search`和`regex_replace`函数来匹配手机号和邮箱地址,并提供了实际代码示例。
摘要由CSDN通过智能技术生成

目录

正则表达式相关概念

正则表达式相关含义

(1) 需加头文件

(2) 字符规则

regex_match

(1) 匹配手机号

(2) 匹配邮箱号

regex_search

regex_replace


正则表达式相关概念

        正则表达式(规则表达式)通常被用来检索、替换那些符合某个模式(规则)的文本。

        是由普通字符集特殊字符(元字符)组成的字符模式。其作为一个模板,将某个字符模式与所搜索的字符串进行匹配。

正则表达式相关含义

(1) 需加头文件

#include <regex>

(2) 字符规则

        

字符描述
\转义字符
^匹配字符行首
$匹配字符行尾
*匹配前面的子表达式任意多次
+匹配前面的子表达式一次或多次
?匹配前面的子表达式0次或一次
{m}匹配确定的m次
{m,}匹配至少m次
{m,n}最少匹配m次,最大匹配n次
.匹配任意字符
x|y匹配x或y
[xyz]字符集合,匹配包含的任意一个字符
[^xyz]匹配未包含的任意字符
[a-z]字符范围,匹配指定范围内的任意字符
[^a-z]匹配任何不在指定范围内的任意字符

regex_match

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

(1) 匹配手机号

#include <iostream>
#include <string>
#include <regex>
using namespace std;
 
int main()
{
	string number;
	while (true)
	{
		cout << "输入手机号:";
		cin >> number;
		//	if (regex_match(number, regex("133[0-9]{8}"))) {
		if (regex_match(number, regex("133\\d{8}"))) {
			cout << "ok" << endl;
            break;
		}
		else {
			cout << "no" << endl;
		}
	}

    return 0;
}

(2) 匹配邮箱号

#include <iostream>
#include <string>
#include <regex>
using namespace std;
 
int main()
{
	string data;
	while (true)
	{
		cout << "输入邮箱号:" << endl;
		cin >> data;
        //qq不支持数字加字母格式,这里表示统一示范格式
//		if (regex_match(data, regex("\\w+@(qq|163|126)\\.com"))) {
//		if (regex_match(data, regex("[a-zA-Z0-9_\u4e00-\u9fa5]+@(qq|163|126)\\.com"))) {
		if (regex_match(data, regex("[a-zA-Z0-9_]+@(qq|163|126)\\.com"))) {
			cout << "ok" << endl;
			break;
		}
		else
		{
			cout << "no" << endl;
		}
    }
    return 0;
}

regex_search

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

#include <iostream>
#include <regex>
#include <string>
using namespace std;
 
int main()
{
    //匹配单个
    string str = "hello2024-04-15word";
    smatch match;//搜索结果
    regex pattern("(\\d{4})-(\\d{1,2})-(\\d{1,2})");//搜索规则  ()表示把内容拿出来
    if (regex_search(str, match, pattern))
    {    
        cout<<match[i]<<endl;
    }

    //匹配多个
    string str = "2024-04-14,2024-04-15,2024-04-16";
	smatch match;
	regex pattern("(\\d{4}-\\d{1,2}-\\d{1,2})");
	string::const_iterator iter = str.cbegin();
	while (regex_search(iter,str.cend(),match,pattern))
	{
		iter = match[0].second;//表示开始和结束位置
		for (size_t i=1;i<match.size();++i)
		{
			cout << match[i] << endl;
		}
	}
 
    return 0;
}


regex_replace

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

    //将字符串中的-替换为/
    cout << regex_replace("2019-08-07", regex("-"), "/") << endl;

    //将字符串中2019替换为2024
	cout << regex_replace("2019-08-07", regex("2019"), "2024") << endl;

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值