[C++] 正则表达式 简单入门(正则匹配,正则查找,正则替换)

一、生成正则表达式

1.头文件

#include <bits/stdc++.h>

注意.h不可少!(这个是万能头文件)

#include <regex>

(这个是正则的头文件) 

2.生成正则表达式对象

例子:如果给定字符串S="Hello",现在要匹配用户输入的字符串T是否包含S字符串"Hello",例如"78495Hello8984"包含了"Hello",而"8495He110"并不包含"Hello"。

使用regex 对象名(格式字符串); 来生成正则表达式对象:

regex r("[[:print:]]*"+S+"[[:print:]]*");  //生成正则表达式对象
//[:print:]表示任意字母、数字、英文标点、空格,*表示0个或多个这样的字符

在构造函数中增加参数regex::icase时为大小写不敏感。

regex r("[[:print:]]*"+S+"[[:print:]]*", regex::icase);

对于[[::]]的用法,举数例如下:

[[:alpha:]] 任意字母

[[:alnum:]] 任意字母、数字

[[:digit:]] 任意数字

[[:graph:]] 任意字母、数字、英文标点

[[:print:]] 任意字母、数字、英文标点、空格

[[:blank:]] 空格或制表符

[[:space:]] 空格

[[:lower:]] 任意小写字母

[[:upper:]] 任意大写字母

[[:punct:]] 任意英文标点

对于*的用法(*或以下其他符号代表前面[[:xxx:]]的数目),举数例如下:

* 0 or more ≥0

+ 1 or more ≥1

? 0 or 1 {0,1}

{int} int    e.g. {5}表示5个

{int,} int or more    e.g. {5,}表示≥5个

{min,max} between min and max(闭区间)    e.g. {5,9} ≥5且≤9

 

二、正则匹配

正则表达式对象字符串对象 匹配

判定 字符串对象 是否符合 正则表达式对象

获取用户输入的字符串,匹配成功则屏幕输出"success",反之"fail":

使用 regex_match(字符串, 正则表达式)函数,这是一个布尔型函数,匹配成功返回true,反之false

string input_str;
cin >> input_str;
if (regex_match(input_str, r)) {
    cout << "success" << endl;
}else{
    cout << "fail" << endl;
}

这里regex_match的实质是将input_str和"[[:print:]]*Hello[[:print:]]*"进行匹配,若input_str满足正则表达式r,则匹配成功。 

完整实例:

#include <bits/stdc++.h>
#include <iostream>
#include <string>
using namespace std;
int main() {
	string S = "Hello";
	regex r("[[:print:]]*"+S+"[[:print:]]*");
	string input_str;
	cin >> input_str;
	if (regex_match(input_str, r)) {
		cout << "success" << endl;
	}else{
		cout << "fail" << endl;
	}
	return 0;
}

 

三、正则查找

判定 字符串对象 是否包含 正则表达式对象

例如,52aHellob25虽然和[[:alpha:]]*Hello[[:alpha:]]*不匹配,但却包含了[[:alpha:]]*Hello[[:alpha:]]*

生成正则表达式对象:

regex r("[[:alpha:]]*Hello[[:alpha:]]*");

调用regex_search函数:

regex_search(字符串, 正则表达式)函数

regex_search("52aHellob25", r);

 完整实例:

#include <bits/stdc++.h>
#include <iostream>
#include <string>
using namespace std;
int main() {
	string S = "Hello";
	regex r("[[:alpha:]]*Hello[[:alpha:]]*");
	string input_str;
	cin >> input_str;
	if (regex_search(input_str, r)) {
		cout << "success" << endl;
	}else{
		cout << "fail" << endl;
	}
	return 0;
}

注:"52aHellob25"是包含 [[:digit:]]*Hello[[:digit:]]* 的,因为*也允许0个。

如果不允许0个而是允许1个或更多,应写作 [[:digit:]]+Hello[[:digit:]]+

 

四、正则替换

在正则查找的基础上,将对应的部分替换为指定字符串

例如,将52aHellob25替换为52World25

调用regex_replace函数:

regex_replace(字符串, 正则表达式,替换后的字符串部分)函数,它返回一个string字符串对象

string new_str = regex_search("52aHellob25", r, "World");

完整实例:

#include <bits/stdc++.h>
#include <iostream>
#include <string>
using namespace std;
int main() {
	string S = "Hello";
	regex r("[[:alpha:]]*Hello[[:alpha:]]*");
	string new_str = regex_replace("52aHellob25", r, "World");
	cout << new_str << endl;
	return 0;
}

 

小结:

头文件

#include <bits/stdc++.h>

#include <regex>

 

设字符串对象为str,正则表达式为r,用字符串word去替换,替换后的字符串为new_str

生成正则表达式对象

regex r("格式");
regex r("格式", regex::icase); //大小写不敏感

 

正则匹配

if ( regex_match(str, r) )

正则查找

if ( regex_search(str, r) )

正则替换

string new_str = regex_replace(str, r, word);

参考文献

CCF认证 201409-3字符串匹配——17行代码(正则表达式) - 日沉云起的博客 - CSDN博客 https://blog.csdn.net/richenyunqi/article/details/85260946

<regex> - C++ Reference http://www.cplusplus.com/reference/regex/

  • 9
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值