C++正则表达式

简介: C++正则表达式

正则表达式概念

正则是指一种规则,用来匹配,捕获,替换字符串(字符串的处理方案)

正则组成

特殊含义元字符

1.^ ,以字符作为字符串开的头,^表示单个字符

2.$:以字符结尾,表示单个字符()

3.():分组

4.\b:字符串的边界

5…:除了\n以外的任意一个字符

6. | :或者的意思, a | b,表示 a或者b

7.[] :一般情况表示字符串的范围,[abc]表示abc任意一个字符

注意 ^通常与[],搭配使用,表示相反的,

例如: [ ^abc] 表示 除abc以外的任意一个字符

[a-z] :表示任意一个小写字母

8. \w 任意数字字母下划线

9.\W:数字字母下划线以外的任意字符 (与\w的作用相反)

10.\d:任意一个数字

11.\D:数字以外的任意一个字符(作用与\d相反)

12.\s:空白符(空格)

量词元字符

1.* 0次或者多次 [a-z]* 表示:多个小写字母或者没有小写字母

2.+:一次或者多次

3.(n) : 出现n次

4.{n, }:至少出现n次

5.{n, m}:至少有n到m个字符

注意:** 在C/C++中 带单\的元字符都要改为双\**

正则表达式的使用

正则库也是C++11新标准以后出现的

有3个功能

1.做匹配

2.做截取

3.做查找

注意要包含头文件 regex

匹配

第一步:先构建正则对象

第二步:用regex_match()函数,进行正则对象的匹配

如果匹配成功,返回true,如果匹配不成功,返回false

#include<string>
#include<iostream>
#include<regex>
using namespace std;
int main()
{
  //可用来设置密码
  regex reg("^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$"); 
  //构造正则对象
  //例如密码的强度为:包含大小写字母和数字的组合,
  //不能使用特殊字符,长度在8 - 10之间。
  string code;
  cin >> code;
  bool ret = regex_match(code, reg); //用regex_match(),做匹配
  if (ret)
  {
    cout << "匹配成功" << endl;
  }
  else
  {
    cout << "匹配不成功" << endl;
  }
  return 0;
}

注意:正则匹配一定是完全匹配

regex 也有第二个参数,

比如说: regex_constants::icase

忽略字母大小写

截取

要使用 regex_search()函数

regex_search(string str, smatch result, regex reg)

其中,匹配的字符串的前缀和后缀,都存在result中的prefix和suffix函数中

匹配的结果在result的str函数中

这个函数的返回值,同样也是bool类型

#include<iostream>
#include<regex>
#include<string>
using namespace std;
int main()
{
  string str = "jibub1314ojojo";
  smatch result;
  //注意:这里regex构造的是无名对象
  bool ret = regex_search(str, result, regex("\\d+"));  //匹配的规则,多个数字
  if (ret)
  {
    cout << " 匹配成功" << endl;
    cout << result.size() << endl;
    for (int i = 0; i < result.size(); i++)
    {
      cout << result.str() << endl;
    }
    cout << result.prefix() << endl; //前缀
    cout << result.suffix() << endl; //后缀
  }
  else
  {
    cout << "false" << endl;
  }
  return 0;
}

这个regex_search() 找到满足 的一个就结束

如果想捕获所有满足条件的字符串

就用sregex_iterator

#include<iostream>
#include<regex>
#include<string>
using namespace std;
int main()
{
  string str = "dbjauh90989kj 8989ji";
  regex reg("\\d+");
  //得到所有满足满足条件的匹配结果
  sregex_iterator pos(str.begin(), str.end(), reg);
  sregex_iterator end;    //无参构造是结束流
  while (pos != end)
  {
    cout << pos->str() << "\t";
    pos++;
  }
  cout << endl;
  return 0;
}

当然,如果你想得到不匹配的

可一使用sregex_token_iterator tpos(str.begin(), str.end(), reg2,-1); 函数

最后一个参数为-1时,得到不匹配的结果,最后一个参数为0时,得到匹配的结果

替换

替换可以用regex_replace()函数

当然可以用来解决一些去重问题

其中有的一些控制替换,

regex_constants 可以去查查帮助手册

#include<iostream>
#include<string>
#include<regex>
using namespace std;
int main()
{
  string str = "ILoveyou******IMiss*******y*****o***u";
  regex reg("\\*+");
  //regex_replace(string str,regex regx,string content)
  //返回值是处理后的字符串
  cout << "888:" << regex_replace(str, reg, "*") << endl;
  //控制替换
  cout << "only one:" << regex_replace(str, reg, "*", regex_constants::format_first_only) << endl;
  cout << "no copy:" << regex_replace(str, reg, "*", regex_constants::format_no_copy) << endl;
  cout << "sed:" << regex_replace(str, reg, "*", regex_constants::format_sed) << endl;
  return 0;
}


相关文章
|
6月前
|
算法 测试技术 C#
【动态规划】【字符串】C++算法:正则表达式匹配
【动态规划】【字符串】C++算法:正则表达式匹配
|
4月前
|
存储 C++ 容器
C++一分钟之-正则表达式库(regex)
【7月更文挑战第7天】C++从C++11开始支持正则表达式,通过`&lt;regex&gt;`库提供功能。本文涵盖基本概念如`std::regex`、`std::smatch`,以及`regex_search`和`regex_match`的使用。常见问题包括大小写敏感性、特殊字符转义、贪婪与非贪婪匹配和捕获组。提供的代码示例展示了如何进行匹配、不区分大小写的匹配、特殊字符匹配、贪婪与非贪婪匹配和捕获组的使用。理解并练习正则表达式能提升文本处理效率。
79 0
|
6月前
|
存储 JavaScript API
C++ 正则表达式库 std::basic_regex 中文手册(API说明来自cppreference.com)
C++ 正则表达式库 std::basic_regex 中文手册(API说明来自cppreference.com)
154 0
|
算法 C++
剑指offer(C++)-JZ19:正则表达式匹配(算法-动态规划)
剑指offer(C++)-JZ19:正则表达式匹配(算法-动态规划)
|
C++ Windows Perl
[笔记]c++基础实践《二》regex正则表达式
[笔记]c++基础实践《二》regex正则表达式
|
移动开发 小程序 JavaScript
【C++】C++ 标准库 — 正则表达式
关于 C++ 标准库中正则表达式的使用 std::regex
255 0
|
算法 C语言 数据安全/隐私保护
【C++技能树】快速文本匹配 --正则表达式介绍与C++正则表达式使用
假设要判断一个QQ号是否有效,他必须满足以下三个规则
122 0
|
JavaScript 算法 Perl
2023-4-26-C++11新特性之正则表达式
2023-4-26-C++11新特性之正则表达式
77 0
|
SQL
C++11之正则表达式(regex_match、regex_search、regex_replace)
C++11之正则表达式(regex_match、regex_search、regex_replace)
203 0