C++11——正则表达式

1. 描述

C++11支持了正则表达式,主要算法有:

  • regex_match,正则表达式要匹配整个字符串

  • regex_search,正则表达式可以匹配字符串中的一部分或全部
  • regex_replace,用一个字符串替换源字符串中匹配正则表达式的那部分子串

2. 使用

Regex.h

#pragma once

// 正则表达式
class CRegex
{
public:
	CRegex();
	~CRegex();

	void Run();
};

Regex.cpp

#include "stdafx.h"
#include "Regex.h"
#include <regex>
#include <iostream>
#include <string>
using namespace std;

CRegex::CRegex()
{
}


CRegex::~CRegex()
{
}

/************************************************************************
	正则表达式 \w \s \d \b
	. 匹配除换行符以外的任意字符
	\w 匹配字母或数字或下划线或汉字 等价于 ‘[A-Za-z0-9_]’
	\s 匹配任意的空白符
	\S	匹配任何非空白字符。等价于 [^ \f\n\r\t\v]
	\d 匹配数字
	\b 匹配单词的开始或结束
	^ 匹配字符串的开始
	$ 匹配字符串的结束
	+ 表示重复一次或者多次
	* 表示重复零次或者多次
	{n,m} 表示n 到 m 次
/************************************************************************/

void CRegex::Run()
{
	//eg1 regex_match算法:匹配整个字符串
	std::regex reg1("\\w+day");
	std::string s1 = "MondayTuesdaySunday";
	std::smatch r1;
	cout << boolalpha << regex_match(s1, r1, reg1) << endl;
	cout << "匹配整个字符串,s1结果:" << r1.str() << endl;

	std::string s2 = "Monday and Tuesday and Sunday";
	std::smatch r2;
	cout << boolalpha << regex_match(s2, r2, reg1) << endl;
	cout << "匹配整个字符串, s2结果:" << r2.str() << endl;
	cout << endl;

	//regex_search只返回第一个匹配结果
	std::smatch rr1;
	std::smatch rr2;
	cout << boolalpha << std::regex_search(s1, rr1, reg1) << endl;
	cout << "只返回第一个匹配结果,s1匹配结果:" << rr1.str() << endl;
	cout << boolalpha << std::regex_search(s2, rr2, reg1) << endl;
	cout << "只返回第一个匹配结果,s2匹配结果:" << rr2.str() << endl;
	cout << endl;


	//使用iterator返回多个匹配结果, 结果要用->
	cout << "====返回多个匹配结果,iterator结果====" << endl;
	std::sregex_iterator it(s2.begin(), s2.end(), reg1);
	std::sregex_iterator end;
	for (; it != end; ++it)
	{
		cout << it->str() << endl;
		//cout << *it << endl; 错误
	}
	cout << "=====================================" << endl;

	cout << "====token_iterator结果====" << endl;
	std::sregex_token_iterator tit(s2.begin(), s2.end(), reg1);
	std::sregex_token_iterator tend;
	for (; tit != tend; ++tit)
	{
		cout << tit->str() << endl;
		//cout << *tit << endl; //OK
	}
	cout << "==========================" << endl;

	//子表达式匹配
	std::regex reg2("(\\d{1,3}):(\\d{1,3}):(\\d{1,3}):(\\d{1,3})");
	std::string ip = "0:11:222:333";
	std::smatch res3;
	std::regex_match(ip, res3, reg2);
	cout << "====IP地址正则结果========" << endl;
	cout << res3.str() << endl;
	cout << res3.str(1) << endl;
	cout << res3.str(2) << endl;
	cout << res3.str(3) << endl;
	cout << res3.str(4) << endl;
	cout << "输出:[i]" << endl;
	cout << res3[0] << endl;
	cout << res3[1] << endl;
	cout << res3[2] << endl;
	cout << res3[3] << endl;
	cout << res3[4] << endl;
	cout << "==========================" << endl;

	//结果输出同上
	//regex_search(ip, m, str2);
	cout << endl;
	std::string ip2 = "0:11:222:333 4:55:66:7";
	std::sregex_iterator ip_it(ip2.begin(), ip2.end(), reg2);
	std::sregex_iterator ip_end;
	for (; ip_it != ip_end; ++ip_it)
	{
		cout << ip_it->str() << endl;
		cout << ip_it->str(1) << endl;
		cout << ip_it->str(2) << endl;
		cout << ip_it->str(3) << endl;
		cout << ip_it->str(4) << endl;
	}


	//regex_replace: 用一个字符串替换源字符串中匹配正则表达式的那部分子串   
	// 问号(?)表示之前的可以选择
	cout << "==========regex_replace================" << endl;
	std::regex r("(\\()?(\\d{3})(\\))?([-. ])?(\\d{3})([-. ]?)(\\d{4})");
	std::string fmt("$2.$5.$7");	//代替
	std::string number("(908)555-1800");
	std::cout << std::regex_replace(number, r, fmt) << std::endl;

	std::string file("Caroline (201)555-2368 862-55-0123");
	std::cout << std::regex_replace(file, r, fmt) << std::endl;
	std::cout << std::regex_replace(file, r, fmt, std::regex_constants::format_no_copy) << std::endl;
}

调用:


#include "stdafx.h"
#include <time.h>
#include <thread>
#include <iomanip>
#include <iostream>
#include "Regex.h"

#define Tab printf("\n");

int main()
{
	std::shared_ptr<CRegex> pFunction = std::make_shared<CRegex>();
	pFunction->Run();		Tab;
	return 0;

}

运行结果:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值