[关闭]
@azmddy 2018-07-23T18:05:43.000000Z 字数 3558 阅读 374

C++正则表达式

C++


正则表达式 Regex(Regular Expression)是描述或匹配某个句法规则的字符串,用于检索、替换那些匹配某个模式的文本。
一个正则表达式通常被称为一个模式。由表达式、量词、断言组成。

目录

表达式

表达式可以是以下项之一:

量词

一个量词指定了要匹配的表达式出现的次数。例如,x{1,1} 表示必须且只能匹配一个字符x,而x{1,3}表示至少匹配一个x,最多匹配三个x

量词 含义
E? 匹配0次或者1次 E(表达式),等价于 E{0,1}
E+ 至少匹配一次 E,等价于 E{1,}
E* 匹配0次或者多次 E,等价于 E{0,}
E{n} 匹配n次E,等价于E{n,n}
E{n,} 至少匹配n次E
E{,m} 至多匹配m次E
E{n,m} 至少匹配n次,至多匹配m次E

例如:[A-C]+, 可匹配 AAAB

断言

断言 含义
\b 一个单词的边界
\B 一个非单词的边界
(?=E) 表达式后面紧跟着E才匹配成功,但不会改名目标序列中匹配的位置
(?!E) 表达式后没有紧跟着E才匹配成功,但不会改名目标序列中匹配的位置
(?:E) 表达式后面紧跟着E才匹配成功

例如:
\\bmail\\b 匹配的就是一个单词mail
This is a T(?!est)表示如果T后面没有est就匹配,这主要用于替换,后面会有实例。
This is a T(?=est)表示如果T后面有est就匹配,这主要用于替换,后面会有实例。

实例

在C++中使用正则表达式需要用到regex库。
默认情况下,正则表达式遵循ECMAScript语法。

常用函数:

函数名称 解释
regex_match 将一个字符序列与正则表达式进行匹配。
regex_search 查找字符序列中与正则表达式匹配的结果,找到第一个之后就会返回结果并停止查找。
regex_replace 替换字符到正交表达式匹配到字符序列的位置。

检验邮箱格式

邮箱的一般格式:xxx@xxx.com
验证 xxx@163.com 格式的邮箱。
正则表达式:[[:graph:]]+@163[.]com,这里将.用方括号括起来是因为.在正在表达式中是一个通配符。

  1. #include <regex>
  2. #include <iostream>
  3. using namespace std;
  4. int main()
  5. {
  6. string re = "[[:graph:]]+@163[.]com";
  7. regex rule(re);
  8. string str = "acvds.cpp@163.com";
  9. cout << regex_match(str, rule) << endl; //true
  10. system("pause");
  11. return 0;
  12. }

IP地址匹配

原理:
IP地址是有四个用小数点隔开的十进制整数(0~255)组成的,每个整数的位数不确定,以及整数是不同位数的时候,每个位上数字的取值范围也会存在差异,所以需要一一匹配。
当整数是一位的时候,取值是0~9,正则表达式\\d(反斜杠需要转义);
当整数是两位的时候,取值是0~9,正则表达式\\d{1,2};
当整数是三位的时候,当最高位是1的时候,其它两位的取值是0~9,正则表达式1\\d{1,2};当最高位是2的时候,其它两位的取值是0~5,正则表达式2[0-5]{1,2};
然后用|(或)连接。

  1. #include <regex>
  2. #include <iostream>
  3. using namespace std;
  4. int main()
  5. {
  6. string re = "(\\d|\\d{1,2}|(1\\d{1,2})|2[0-5]{1,2})[.](\\d|\\d{1,2}|(1\\d{1,2})|2[0-5]{1,2})[.](\\d|\\d{1,2}|(1\\d{1,2})|2[0-5]{1,2})[.](\\d|\\d{1,2}|(1\\d{1,2})|2[0-5]{1,2})";
  7. regex rule(re);
  8. string str = "100.100.100.0";
  9. cout << regex_match(str, rule) << endl; //true
  10. system("pause");
  11. return 0;
  12. }

英译汉

这里主要涉及到regex_replace函数的使用。
函数原型:

  1. basic_string<_Elem, _Traits1, _Alloc1> regex_replace(
  2. const basic_string<_Elem, _Traits1, _Alloc1>& _Str,
  3. const basic_regex<_Elem, _RxTraits>& _Re,
  4. const _Elem *_Ptr,
  5. regex_constants::match_flag_type _Flgs =regex_constants::match_default);

一共四个参数,第一个参数是目标字符串,第二个参数是正则表达式规则,第三个是用于替换的字符串, 第四个是设置正则表达式如何匹配以及格式化用于替换的字符串。

  1. #include <regex>
  2. #include <iostream>
  3. using namespace std;
  4. int main()
  5. {
  6. string re1 = "i";
  7. string re2 = "love";
  8. string re3 = "you";
  9. regex rule1(re1);
  10. regex rule2(re2);
  11. regex rule3(re3);
  12. string str = " i love you.";
  13. str = regex_replace(str, rule1, "我");
  14. str = regex_replace(str, rule2, "喜欢");
  15. str = regex_replace(str, rule3, "你");
  16. cout << str << endl;//我喜欢你
  17. system("pause");
  18. return 0;
  19. }

画龙点睛

  1. #include <regex>
  2. #include <iostream>
  3. using namespace std;
  4. int main()
  5. {
  6. string re = "E(?!xpression)";
  7. regex rule(re);
  8. string str = "Regular E";
  9. cout << regex_replace(str,rule,"Expression") << endl; //Regular Expression
  10. system("pause");
  11. return 0;
  12. }

写在最后

正则表达式一个非常有用的利器,掌握它需要多加练习,实践出真知!
如果想了解更多关于正则表达的内容,清点击以下链接:
链接1
链接2

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注