史上最全最常用的正则表达式(最新整理+基本够用+值得收藏)

在这里插入图片描述
简介:
正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。

一、校验数字的表达式

1 数字:1*$

2 n位的数字:^d{n}$

3 至少n位的数字:^d{n,}$

4 m-n位的数字:^d{m,n}$

5 零和非零开头的数字:^(0|[1-9][0-9]*)$

6 非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9]{1,2})?$

7 带1-2位小数的正数或负数:^(-)?d+(.d{1,2})?$

8 正数、负数、和小数:^(-|+)?d+(.d+)?$

9 有两位小数的正实数:2+(.[0-9]{2})?$

10 有1~3位小数的正实数:3+(.[0-9]{1,3})?$

11 非零的正整数:4d*$ 或 ^([1-9][0-9]){1,3}$ 或 ^+?[1-9][0-9]$

12 非零的负整数:^-[1-9][]0-9"$ 或 ^-[1-9]d$

13 非负整数:^d+$ 或 5d*|0$

14 非正整数:^-[1-9]d*|0$ 或 ^((-d+)|(0+))$

15 非负浮点数:^d+(.d+)?$ 或 6d*.d*|0.d*[1-9]d*|0?.0+|0$

16 非正浮点数:^((-d+(.d+)?)|(0+(.0+)?))$ 或 ^(-([1-9]d*.d*|0.d*[1-9]d*))|0?.0+|0$

17 正浮点数:7d*.d*|0.d*[1-9]d*$ 或 ^(([0-9]+.[0-9][1-9][0-9])|([0-9][1-9][0-9].[0-9]+)|([0-9][1-9][0-9]))$

18 负浮点数:^-([1-9]d*.d*|0.d*[1-9]d*)$ 或 ^(-(([0-9]+.[0-9][1-9][0-9])|([0-9][1-9][0-9].[0-9]+)|([0-9][1-9][0-9])))$

19 浮点数:^(-?d+)(.d+)?$ 或 ^-?([1-9]d*.d*|0.d*[1-9]d*|0?.0+|0)$

二、校验字符的表达式

1 汉字:8{0,}$

2 英文和数字:9+$ 或 10{4,40}$

3 长度为3-20的所有字符:^.{3,20}$

4 由26个英文字母组成的字符串:11+$

5 由26个大写英文字母组成的字符串:12+$

6 由26个小写英文字母组成的字符串:13+$

7 由数字和26个英文字母组成的字符串:14+$

8 由数字、26个英文字母或者下划线组成的字符串:^w+$ 或 ^w{3,20}$

9 中文、英文、数字包括下划线:15+$

10 中文、英文、数字但不包括下划线等符号:16+$ 或 17{2,20}$

11 可以输入含有^%&’,;=?KaTeX parse error: Expected group after '^' at position 7: "等字符:[^̲%&',;=?x22]+

12 禁止输入含有的字符:[^x22]+

三、特殊需求表达式

1 Email地址:^w+([-+.]w+)@w+([-.]w+).w+([-.]w+)*$

2 域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?

3 InternetURL:[a-zA-z]+://[^s]* 或 ^http://([w-]+.)+[w-]+(/[w-./?%&=]*)?$

4 手机号码:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])d{8}$

5 电话号码(“XXX-XXXXXXX”、“XXXX-XXXXXXXX”、“XXX-XXXXXXX”、“XXX-XXXXXXXX”、"XXXXXXX"和"XXXXXXXX):^((d{3,4}-)|d{3.4}-)?d{7,8}$

6 国内电话号码(0511-4405222、021-87888822):d{3}-d{8}|d{4}-d{7}

7 身份证号:

15或18位身份证:^d{15}|d{18}$

15位身份证:18d{7}((0d)|(1[0-2]))(([0|1|2]d)|3[0-1])d{3}$

18位身份证:19d{5}[1-9]d{3}((0d)|(1[0-2]))(([0|1|2]d)|3[0-1])d{4}$

8 短身份证号码(数字、字母x结尾):^([0-9]){7,18}(x|X)?$ 或 ^d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$

9 帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):20[a-zA-Z0-9_]{4,15}$

10 密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):21w{5,17}$

11 强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间):^(?=.d)(?=.[a-z])(?=.*[A-Z]).{8,10}$

12 日期格式:^d{4}-d{1,2}-d{1,2}

13 一年的12个月(01~09和1~12):^(0?[1-9]|1[0-2])$

14 一个月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$

15 钱的输入格式:

16 1.有四种钱的表示形式我们可以接受:“10000.00” 和 “10,000.00”, 和没有 “分” 的 “10000” 和 “10,000”:22[0-9]*$

17 2.这表示任意一个不以0开头的数字,但是,这也意味着一个字符"0"不通过,所以我们采用下面的形式:^(0|[1-9][0-9]*)$

18 3.一个0或者一个不以0开头的数字.我们还可以允许开头有一个负号:^(0|-?[1-9][0-9]*)$

19 4.这表示一个0或者一个可能为负的开头不为0的数字.让用户以0开头好了.把负号的也去掉,因为钱总不能是负的吧.下面我们要加的是说明可能的小数部分:23+(.[0-9]+)?$

20 5.必须说明的是,小数点后面至少应该有1位数,所以"10."是不通过的,但是 “10” 和 “10.2” 是通过的:24+(.[0-9]{2})?$

21 6.这样我们规定小数点后面必须有两位,如果你认为太苛刻了,可以这样:25+(.[0-9]{1,2})?$

22 7.这样就允许用户只写一位小数.下面我们该考虑数字中的逗号了,我们可以这样:26{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$

23 8.1到3个数字,后面跟着任意个 逗号+3个数字,逗号成为可选,而不是必须:^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$

24 备注:这就是最终结果了,别忘了"+“可以用”*"替代如果你觉得空字符串也可以接受的话(奇怪,为什么?)最后,别忘了在用函数时去掉去掉那个反斜杠,一般的错误都在这里,小编给大家推荐一个学习氛围超好的地方,PHP交流企鹅裙:点击进入学习适合在校大学生,小白,想转行,想通过这个找工作的加入。裙里有大量学习资料,有大神解答交流问题,每晚都有免费的直播课程。

25 xml文件:^([a-zA-Z]±?)+[a-zA-Z0-9]+.[x|X][m|M][l|L]$

26 中文字符的正则表达式:[u4e00-u9fa5]

27 双字节字符:[^x00-xff] (包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1))

28 空白行的正则表达式: s* (可以用来删除空白行)

29 HTML标记的正则表达式:<(S*?)[^>]>.?</>|<.*? /> (网上流传的版本太糟糕,上面这个也仅仅能部分,对于复杂的嵌套标记依旧无能为力)

30 首尾空白字符的正则表达式:^s*|s* 或 ( s ∗ ) ∣ ( s ∗ 或(^s*)|(s* (s)(s) (可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式)

31 腾讯QQ号:[1-9][0-9]{4,} (腾讯QQ号从10000开始)

32 中国邮政编码:[1-9]d{5}(?!d) (中国邮政编码为6位数字)

33 IP地址:d+.d+.d+.d+ (提取IP地址时有用)


  1. 0-9 ↩︎

  2. 0-9 ↩︎

  3. 0-9 ↩︎

  4. 1-9 ↩︎

  5. 1-9 ↩︎

  6. 1-9 ↩︎

  7. 1-9 ↩︎

  8. u4e00-u9fa5 ↩︎

  9. A-Za-z0-9 ↩︎

  10. A-Za-z0-9 ↩︎

  11. A-Za-z ↩︎

  12. A-Z ↩︎

  13. a-z ↩︎

  14. A-Za-z0-9 ↩︎

  15. u4E00-u9FA5A-Za-z0-9_ ↩︎

  16. u4E00-u9FA5A-Za-z0-9 ↩︎

  17. u4E00-u9FA5A-Za-z0-9 ↩︎

  18. 1-9 ↩︎

  19. 1-9 ↩︎

  20. a-zA-Z ↩︎

  21. a-zA-Z ↩︎

  22. 1-9 ↩︎

  23. 0-9 ↩︎

  24. 0-9 ↩︎

  25. 0-9 ↩︎

  26. 0-9 ↩︎

<think>好的,用户想了解C++正则表达式的使用方法和示例代码。之前的问题是关于MFC中的afx_msg,现在突然转向正则表达式,可能用户正在学习不同的C++特性,或者在做项目时需要用到正则处理字符串。我需要结合提供的四个引用内容来组织回答,确保覆盖用户的需求。 首先,用户提到了四个引用,其中引用1和2提到C++11的正则与其他语言的差异,以及如何将通配符转换为正则表达式。引用3展示了使用sregex_iterator的示例,引用4详细说明了C++标准库中的正则类和相关函数。用户需要示例代码和用法解释,所以应该分几个部分来讲解,比如匹配、搜索、替换、迭代器使用等。 需要确保回答结构清晰,先介绍基本用法,再给出不同函数的示例,比如regex_match、regex_search、regex_replace,以及迭代器的使用。每个示例代码要配上解释,说明各部分的作用。同时,要注意用户提到的将通配符转换为正则的示例,可能用户对模式转换感兴趣,可以单独作为一个示例讲解。 另外,用户可能对正则语法不太熟悉,但根据引用1,用户只需要常见的够用的规则,所以不需要深入复杂的语法,重点放在C++库的使用上。需要确认示例代码的正确性,比如头文件引用是否正确,命名空间是否使用等。例如,引用2的代码中用了<bits/stdc++.h>,虽然可以编译,但好建议使用具体的头文件,如<iostream>和<regex>,并注明using namespace std的注意事项。 还要注意用户可能遇到的问题,比如转义字符的处理,在C++中需要使用双反斜杠,这点需要特别说明。另外,引用3中的sregex_iterator的用法,需要解释迭代器如何工作,matched成员的用途。引用4提到的反义字符和类模板,可以在示例中适当提及,比如使用\D匹配非数字。 后,生成相关问题时要覆盖用户可能感兴趣的扩展内容,比如性能优化、异常处理、与其他语言的差异,以及实际应用场景如日志分析等。确保问题与用户之前的问题和当前回答内容相关,帮助用户深入理解。</think>以下是对C++正则表达式核心用法及示例的详细解析,结合标准库函数和典型场景: --- ### 一、基础用法框架 ```cpp #include <iostream> #include <regex> // 核心头文件 using namespace std; int main() { string text = "Sample text with numbers: 123, 456.78"; regex pattern(R"(\d+\.?\d*)"); // 匹配整数或浮点数 // 使用方式见下文分解 } ``` --- ### 二、核心函数详解 #### 1. **完全匹配验证** `regex_match` ```cpp string input = "2023-08-20"; regex date_pattern(R"(\d{4}-\d{2}-\d{2})"); // 匹配YYYY-MM-DD格式 if (regex_match(input, date_pattern)) { cout << "Valid date format" << endl; } else { cout << "Invalid format" << endl; } ``` **特性**:必须完全匹配整个字符串常用于格式验证[^4] --- #### 2. **子串搜索** `regex_search` ```cpp string log = "Error[CODE:404] at 15:30"; regex code_pattern(R"(\[CODE:(\d+)\])"); // 捕获错误码 smatch matches; if (regex_search(log, matches, code_pattern)) { cout << "Error code: " << matches[1] << endl; // 输出404 } ``` **关键点**: - `smatch`存储匹配结果 - `matches[0]`为完整匹配内容 - `matches[1]`为第一个捕获组[^4] --- #### 3. **内容替换** `regex_replace` ```cpp string text = "Contact: tel:123-4567 or cell:890-1234"; regex phone_pattern(R"((\d{3})-(\d{4}))"); string result = regex_replace(text, phone_pattern, "***-****"); cout << result; // 输出"Contact: tel:***-**** or cell:***-****" ``` --- #### 4. **迭代器遍历** `sregex_iterator` ```cpp string data = "ID:A1B2, ID:X3Y4, ID:Z5"; regex id_pattern(R"(ID:([A-Z]\d[A-Z]\d))"); for(sregex_iterator it(data.begin(), data.end(), id_pattern), end; it != end; ++it) { cout << "Found ID: " << (*it)[1] << endl; // 输出A1B2, X3Y4 } ``` **特性**: - 遍历所有非重叠匹配 - `(*it)[n]`访问第n个捕获组[^3] --- ### 三、模式构建技巧 #### 1. 通配符转换示例 ```cpp string wildcard = "file_??.txt*"; string regex_str; for(char c : wildcard) { if(c == '?') regex_str += '.'; else if(c == '*') regex_str += ".*"; else regex_str += c; } // 转换结果: "file_..\.txt.*" ``` #### 2. 特殊字符处理 ```cpp regex email(R"([\w\.-]+@[\w\.-]+\.\w+)"); // 使用原始字符串避免转义 regex path(R"(C:\\Users\\.+)"); // 匹配Windows路径需双反斜杠 ``` --- ### 四、进阶特性 #### 1. 捕获组应用 ```cpp string html = "<a href='http://example.com'>Link</a>"; regex tag_pattern(R"(<a href='(.*?)'>(.*?)</a>)"); if(regex_search(html, matches, tag_pattern)) { cout << "URL: " << matches[1] << "\nText: " << matches[2] << endl; } ``` #### 2. 匹配控制标志 ```cpp regex_case1 = regex("test", regex_constants::icase); // 忽略大小写 regex_case2 = regex("^start", regex_constants::multiline); // 多行模式 ``` --- ### 五、性能优化建议 1. **预编译正则对象**:重复使用时避免重复构造 2. **谨慎使用.***:尽量用限定符`{n,m}`代替 3. **避免回溯爆炸**:对复杂模式进行简化 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值