C  正则表达式 - 简书 - 图1

2019.06.29 23:18:13 字数 657 阅读 3,353

regex 类表示一个正则表达式,regex_match 和 regex_search 确定一个给定字符串与一个给定的 regex 是否匹配,如果整个字符串与 regex 匹配则 regex_match 返回 true,如果字符串中的一个子串与 regex 匹配,则 regex_search 返回 true。如果它们的参数中包含 smatch 参数,成功匹配的相关信息存在该参数中。regex_replace 将给定的字符串替换为另外一种形式。

  1. int main()
  2. {
  3. regex r1("[0-9]+");
  4. smatch results1;
  5. cout << boolalpha << regex_match("123", r1) << endl;
  6. cout << regex_match("12a", r1) << endl;
  7. string str1{ "abc12345de111" };
  8. if (regex_search(str1, results1, r1)) {
  9. cout << results1.str()<< endl;
  10. }
  11. regex r2("[0-9]+[a-z]+");
  12. cout << boolalpha << regex_match("123", r2) << endl;
  13. cout << regex_match("12a", r2) << endl;
  14. system("pause");
  15. }

指定 regex 对象的选项

当我们定义一个 regex 或对一个 regex 调用 assign 为其赋新值时,可以指定一些标志来影响 regex 如何操作,默认值为 ECMAScript ,从而使 regex 会使用 ECMA-262 规范,这是很多 Web 浏览器使用的正则表达式语言。

  1. static constexpr flag_type icase = regex_constants::icase;
  2. static constexpr flag_type nosubs = regex_constants::nosubs;
  3. static constexpr flag_type optimize = regex_constants::optimize;
  4. static constexpr flag_type collate = regex_constants::collate;
  5. static constexpr flag_type ECMAScript = regex_constants::ECMAScript;
  6. static constexpr flag_type basic = regex_constants::basic;
  7. static constexpr flag_type extended = regex_constants::extended;
  8. static constexpr flag_type awk = regex_constants::awk;
  9. static constexpr flag_type grep = regex_constants::grep;
  10. static constexpr flag_type egrep = regex_constants::egrep;
  11. int main()
  12. {
  13. regex r1("[a-z]+");
  14. cout << boolalpha << regex_match("abc", r1) << endl;
  15. cout << regex_match("ABC", r1) << endl;
  16. regex r2("[a-z]+",regex::icase|regex::ECMAScript);
  17. cout << boolalpha << regex_match("abc", r2) << endl;
  18. cout << regex_match("ABC", r2) << endl;
  19. system("pause");
  20. }

正则表达式异常处理

如果编写的正则表达式存在错误,则在运行时标准库会抛出一个类型为 regex_error 的异常。

  1. int main()
  2. {
  3. try {
  4. regex r1("[a-z");
  5. }catch (regex_error e) {
  6. cout <<e.what() <<endl<<"code:"<< e.code() << endl;
  7. }
  8. system("pause");
  9. }

正则表达式类型和字符串类型

字符串类型 正则表达式类型
string regex,smatch,ssub_match,sregex_iterator
const char* regex,cmatch,csub_match,cregex_iterator
wstring wregex,wsmatch,wssub_match,wsregex_iterator
const wchar_t* wregex,wcmatch,wcsub_match,wcregex_iterator

regex 迭代器

使用 sregex_iterator 可以获得所有匹配结果,将 sregex_iterator 绑定到一个字符串和一个 regex 对象时,sregex_iterator 会调用 regex_search 查找第一个匹配位置,解引用迭代器时会得到最近一次搜索结果的 smatch 对象,当我们递增迭代器时,它调用 regex_search 查找下一个匹配。

sregex_iterator 有两个名为 prefix 和 suffix 的成员,分别返回当前匹配之前和之后部分的 ssub_match 对象。

  1. int main()
  2. {
  3. string pattern("[0-9]+");
  4. regex r1(pattern);
  5. string str = "12234abc11111def2222ghj3333";
  6. for (sregex_iterator it(str.begin(), str.end(), r1), endIt; it != endIt; ++it) {
  7. cout <<it->prefix().str()<<" "<< it->str() <<" "<<it->suffix().str()<< endl;
  8. }
  9. system("pause");
  10. }

子表达式匹配

正则表达式中通常包含一个或多个子表达式,子表达式通常用括号表示,在使用 smatch 保存匹配结果时,str(),str(0) 表示整体正则表达式的匹配,str(1) 表示第一个子表达式的匹配,str(2) 表示第二个子表达式的匹配,依此类推。

smatch 包含多个 ssub_match 元素,位置 0 的元素表示整体匹配结果,其余元素表示子表达式的匹配结果,如果匹配了则 matched 成员为 true,如果整体都没匹配,则子表达式均不匹配。

  1. int main()
  2. {
  3. string pattern("([0-9]+)([a-z]+)");
  4. regex r(pattern);
  5. string str1 = "12234abc";
  6. smatch result1;
  7. if (regex_search(str1, result1, r)) {
  8. cout << result1.str(0) << endl;
  9. cout << result1.str(1) << endl;
  10. cout << result1.str(2) << endl;
  11. cout << result1.str(10000) << endl;
  12. cout << boolalpha << result1[0].matched << endl;
  13. cout << result1[1].matched << endl;
  14. cout << result1[2].matched << endl;
  15. cout << result1[3].matched << endl;
  16. }
  17. string pattern2("([0-9]+)([a-z]+)");
  18. regex r2(pattern2);
  19. string str2 = "12234";
  20. smatch result2;
  21. regex_search(str2, result2, r2);
  22. cout << result2[0].matched << endl;
  23. cout << result2[1].matched << endl;
  24. cout << result2[2].matched << endl;
  25. string pattern3("([0-9]+)([a-z]+)?");
  26. regex r3(pattern3);
  27. string str3 = "12234";
  28. smatch result3;
  29. regex_search(str3, result3, r3);
  30. cout << result3[0].matched << endl;
  31. cout << result3[1].matched << endl;
  32. cout << result3[2].matched << endl;
  33. system("pause");
  34. }

regex_replace

regex_replace 可以查找匹配正则表达式的字符串并使用其它格式来替换,符号 $ 后跟子表达式的索引号表示一个特定的子表达式。

  1. int main()
  2. {
  3. string pattern("([0-9]{4})-([0-9]{2})-([0-9]{2})");
  4. regex r(pattern);
  5. string date = "2019-06-28 2019-06-29";
  6. cout << regex_replace(date, r, "$1.$2.$3") << endl;
  7. system("pause");
  8. }

默认情况下 regex_replace 会将未匹配的部分原样输出,我们可以通过指定 format_no_copy 不输出未匹配部分。

  1. int main()
  2. {
  3. string pattern("([0-9]{4})-([0-9]{2})-([0-9]{2})");
  4. regex r(pattern);
  5. string date = "当前日期:2019-06-28";
  6. cout << regex_replace(date, r, "$1.$2.$3",regex_constants::format_no_copy) << endl;
  7. system("pause");
  8. }

更多精彩内容下载简书 APP

“小礼物走一走,来简书关注我”

还没有人赞赏,支持一下

C  正则表达式 - 简书 - 图2

总资产 29 (约 1.33 元) 共写了 11.9W 字获得 71 个赞共 16 个粉丝

被以下专题收入,发现更多相似内容

推荐阅读更多精彩内容

  • 变量类型的判断 1.JS 中常见的数据类型分为基本类型(7 种):string、boolean、number、unde…

  • 置函数就是 Python 给你提供的, 拿来直接用的函数,比如 print,input 等。 截止到 python 版本 3.6…
    C  正则表达式 - 简书 - 图3

  • String.fromCodePoint() String.fromCharCode(0x20BB7) //ஷ …

  • 导入 numpy 库: import numpy as np Numpy 是 python 的一个科学计算库的一个基础包,包…
    C  正则表达式 - 简书 - 图4
    放心笑
    阅读 93 评论 0 赞 2

  • 前言 《编写高质量 python 代码的 59 个有效方法》这本书分类逐条地介绍了编写 python 代码的有效思路和方法,对…
    C  正则表达式 - 简书 - 图5

    https://www.jianshu.com/p/2bf656cd5e56