正则表达式教程

警告
本文最后更新于 2022-09-04,文中内容可能已过时。

用来描述字符串模式匹配规则的表达式。

正则表达式意义等价
a单个指定字母
0单个指定数字
\\\
\**
\..
\n换行符
\f换页符
\t制表符
.单个除了换行符之外的任何字符
\d单个数字[0-9]
\D单个非数字字符[^0-9][^\d]
\w单个字母或数字或下划线[a-zA-Z0-9_]
\W单个非字母非数字非下划线字符[^a-zA-Z0-9_][^\w]
\s单个空白字符(空格、换行符、换页符、制表符)[ \n\f\t]
\S单个非空白字符[^ \n\f\t][^\s]
正则表达式意义
?匹配0或1次
*匹配任意次(大于等于0)
+至少匹配一次(大于等于1)
{a}匹配a次
{a,b}至少匹配a次,至多匹配b次([a,b])
{a,}至少匹配a次(大于等于a)
{0,b}至多匹配b次([0,b])
正则表达式意义
\b单词边界
\B非单词边界
^字符串开头
$字符串结尾
/规则/m多行模式
/规则/i忽略大小写
/规则/g全局模式
正则表达式意义
``
[^]逻辑非
  • 回溯引用
  • 前向查找
  • 后向查找
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#include <regex>

// 转义字符
regex reg1("^[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)+$");
regex_match("google@gmail.com", reg1); // 1

// 原生字符串 R"(...)"
regex reg2(R"(^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$)");
regex_match("google@gmail.com", reg2); // 1

//
  1. 整数:^-?\d+$
    1. 自然数(非负整数):^\d+$
    2. 正整数:^[0-9]*[1-9][0-9]*$
    3. 非正整数:^((-\d+) ?(0+))$
    4. 负整数:^-[0-9]*[1-9][0-9]*$
  2. 浮点数:^(-?\d+)(\.\d+)?$
    1. 非负浮点数:^\d+(\.\d+)?$
    2. 正浮点数:^(([0-9]+\.[0-9]*[1-9][0-9]*) ?([0-9]*[1-9][0-9]*\.[0-9]+) ?([0-9]*[1-9][0-9]*))$
    3. 非正浮点数:^((-\d+(\.\d+)?) ?(0+(\.0+)?))$
    4. 负浮点数:^(-(([0-9]+\.[0-9]*[1-9][0-9]*) ?([0-9]*[1-9][0-9]*\.[0-9]+) ?([0-9]*[1-9][0-9]*)))$
  3. 下划线、数字和大小写字母:^\w+$
    1. 数字和大小写字母:^[A-Za-z0-9]+$
      1. 大小写字母:^[A-Za-z]+$
        1. 大写字母:^[A-Z]+$
        2. 小写字母:^[a-z]+$
  4. 中文字符:[\u4e00-\u9fa5]
  5. 双字节字符:[^\x00-\xff],可以用来计算字符串的长度
  6. 空行:\n[\s ? ]*\r,可以用来删除空白行
  7. HTML标记:/ <(.*)>.* <\/\1> ? <(.*) \/>/,仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力
  8. 首尾空格:(^\s*) ?(\s*$) ^\s* ?\s*$,可以用来删除行首行尾的空白字符
  9. 电子邮件:^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$ \w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
  10. 网址(URL):(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$ [a-zA-z]+://[^\s]*
  11. 命名规则(字母开头,长度5-16,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
  12. 中国座机号码:\d{3}-\d{8} ?\d{4}-\d{7}
  13. QQ号:[1-9][0-9]{4,}
  14. 中国邮政编码:[1-9]\d{5}(?!\d)
  15. 中国身份证:\d{15} ?\d{18}
  16. IP地址:\d+\.\d+\.\d+\.\d+
  • Regexper:正则表达式规则可视化。
  1. 正则表达式不要背 - 掘金
  2. C++正则表达式 - cpluspluser - 博客园