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;
}
运行结果: