【一文了解】正则表达式
目录
正则表达式
1.理解正则表达式
2.正则的核心作用
2.1.验证(判断文本是否符合格式)
2.2.提取(从文本中抓出需要的内容)
2.3.替换(批量修改文本内容)
3.理解正则的2个核心概念:“原子”和“量词”
3.1.原子:“单个要匹配的内容”
1)特殊转义字符
2)特殊转义字符:常用反义词
3)字符集
4)组合字符
3.2.量词:“原子要重复多少次”
3.3.组合示例
4.核心使用原则
5.常用正则模板
本篇文章来分享一下正则表达式。
正则表达式
1.理解正则表达式
首先来理解一下正则表达式(简称“正则”),我们可以把它看作一套“文本匹配与处理的通用规则”,用特定符号组合成“模式”,告诉程序“要找什么样的文本”“怎么处理找到的文本”。
用“生活场景”类比正则
比如你想在一堆文件中找“所有以‘报告’开头、以‘2025.pdf’结尾的文件”,用自然语言描述的规则是:
1)开头必须是“报告”;
2)中间可以是任意内容(比如“销售”“财务”);
3)结尾必须是“2025.pdf”。
那此时对应的正则模式就是^报告.*2025\.pdf$,其中:
1)^代表“开头”,$代表“结尾”(锁定完整字符串);
2).*代表“任意字符重复任意次”(中间的任意内容);
3)\.代表“实际的点”(因为.在正则中有特殊含义,需要转义)。
简而言之,正则就是把“自然语言的匹配规则”,翻译成程序能懂的“符号代码”。其本质是“用符号描述文本规则”。
2.正则的核心作用
正则的价值在于“用简洁的模式替代复杂的代码逻辑”,核心场景分3类:
2.1.验证(判断文本是否符合格式)
比如:
1)手机号是否是“1开头+10位数字”?正则:^1[3-9]\d{9}$;
2)邮箱是否有“@”和“.”?正则:^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$;
3)密码是否包含“字母+数字+8位以上”?正则:^(?=.*[A-Za-z])(?=.*\d).{8,}$。
没有正则时,你需要写几十行代码判断字符类型、长度、特殊符号位置;有了正则,一行模式就能搞定。
2.2.提取(从文本中抓出需要的内容)
比如:
1)从“订单号:20251016001,金额:99元”中提取订单号和金额,正则:订单号:(\d+),金额:(\d+)元((\d+)代表“提取连续数字”);
2)从HTML标签<title>首页</title>中提取标题,正则:<title>(.*?)</title>(.*?代表“非贪婪匹配,只抓标签内的内容”)。
2.3.替换(批量修改文本内容)
比如:
1)把所有手机号中间4位换成“****”,正则匹配:(\d{3})\d{4}(\d{4}),替换为:$1****$2($1代表第一个括号提取的内容,$2代表第二个);
2)把文本中所有“张三”换成“李四”,正则:张三(简单匹配直接替换)。
3.理解正则的2个核心概念:“原子”和“量词”
正则模式的最小组成单元是“原子”(单个匹配元素)和“量词”(原子的重复次数),所有复杂正则都是这两者的组合。
3.1.原子:“单个要匹配的内容”
可以理解为“最小的匹配单元”,常见类型:
符号/表达式 | 含义 | 示例 |
普通字符 | 匹配字符本身 | a 只匹配“a” |
特殊转义字符 | 有特殊含义的字符 | \d匹配数字(0-9) |
字符集 | 匹配字符集[]中的某一字符 | [0-9]匹配0-9任意一个数字(等同于 \d) |
组合符号 | 把()内的内容作为整体进行匹配 | (abc)把“abc”当作一个整体匹配 |
1)特殊转义字符
符号/表达式 | 含义 |
\w | 匹配字母或数字或下划线 |
\s | 匹配任意的空白符 |
\d | 匹配数字 |
\b | 匹配单词的开始或结束 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束 |
. | 匹配除换行符以外的任意字符 |
2)特殊转义字符:常用反义词
符号/表达式 | 含义 |
\W | 匹配任意不是字母,数字,下划线,汉字的1字符[A-Za-z0-9_] |
\S | 匹配任意不是空白符的字符 |
\D | 匹配任意非数字的字符 |
\B | 匹配不是单词开头或结束的位置 |
[^x] | 匹配除了x以外的任意字符 |
[^aeiou] | 匹配除了aeiou这几个字母以外的任意字符 |
3)字符集
符号/表达式 | 含义 |
[a-z] | 匹配“a到z”任意一个小写字母(字符集,范围用 - 连接) |
[A-Z] | 匹配“A到Z”任意一个大写字母 |
[0-9] | 匹配“0到9”任意一个数字(等同于 \d) |
[a-zA-Z0-9] | 匹配“字母+数字”任意一个(等同于 \w,但不含下划线) |
4)组合字符
符号/表达式 | 含义 | 示例 |
(abc) | 分组:把“abc”当作一个整体原子(可用于提取内容、重复控制) | (ab)+ →匹配“ab”“abab”“ababab” |
.* | 匹配“任意字符重复任意次”(贪婪匹配:尽可能多匹配) | a.*c →匹配“a123c”“a@#c”,也匹配“a123b456c”(连中间的b也包含) |
.*? | 匹配“任意字符重复任意次”(非贪婪匹配:尽可能少匹配) | a.*?c →匹配“a123ca@#c”,不匹配“a123b456c”(到第一个c就停止) |
3.2.量词:“原子要重复多少次”
控制原子的匹配次数,常见类型:
量词 | 示例 | 含义 |
* | a* | 匹配0次或多次(比如 a* 可匹配“”“a”“aa”) |
+ | a+ | 匹配1次或多次(必须至少有1个“a”) |
? | a? | 匹配0次或1次(最多1个“a”) |
{n} | a{3} | 精确匹配n次(比如 a{3} 只匹配“aaa”) |
{n,} | a{2,} | 匹配n次或更多(至少2个“a”) |
{n,m} | a{2,4} | 匹配n到m次(2-4个“a”) |
3.3.组合示例
用“原子+量词”拼出规则,比如“匹配3-6位数字的密码”:
原子:\d(数字);
量词:{3,6}(3-6次);
正则:^\d{3,6}$(^和$锁定完整字符串,避免匹配“1234567”中的前6位)。
4.核心使用原则
1)先定位,再匹配
复杂场景先加^和$锁定字符串范围(如验证手机号^1[3-9]\d{9}$),避免部分匹配(比如“138001380001”多1位也能匹配)。
2)特殊符号必转义
遇到.*?[]()等特殊符号,想匹配其“本身”时,必须加\转义(如匹配“www.baidu.com”的点,需写www\.baidu\.com)。
3)量词跟在原子后
量词(如+{3})必须紧跟“原子”(单个字符或分组),比如\d{3}(3个数字)、(ab)+(多个ab),不能单独使用。
5.常用正则模板
其中(?=)为正向预查的语法,用于断言(判断)字符串中是否包含至少一个字母(大小写均可),但不会消耗匹配的字符(即不参与最终的匹配结果,仅做条件判断),即只检查条件是否成立,不实际匹配任何字符。
适用场景 | 正则表达式 | 匹配说明(示例) | 注意事项 |
中国手机号验证 | ^1[3-9]\d{9}$ | 匹配11位手机号(开头13-19,后9位数字) ✅正确:13800138000、19912345678 ❌错误:12345678901(开头12)、1380013800(少1位) | 覆盖国内主流手机号段,不包含卫星电话等特殊号段 |
邮箱格式验证 | ^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$ | 匹配标准邮箱(用户名含字母/数字/下划线/减号,域名带后缀) ✅正确:test@example.com、user-123.abc@my-domain.co.uk ❌错误:test@example(无后缀)、test@.com(主域空) | 日常注册/登录场景够用,不支持国际ized邮箱(如含中文) |
6位数字验证码 | ^\d{6}$ | 匹配纯6位数字(常用于短信验证码、支付验证码) ✅正确:123456、008899 ❌错误:12345(少1位)、12345a(含字母) | 若需要4/5位,修改 {6} 为 {4}/{5} 即可 |
密码强度(字母+数字+8位以上) | ^(?=.*[A-Za-z])(?=.*\d).{8,}$ | 匹配至少8位,且同时包含字母和数字的密码 ✅正确:Abc12345、user_123456(含下划线也可) ❌错误:12345678(纯数字)、abcdefgh(纯字母) | (?=.*[A-Za-z]) 是“必须含字母”的断言,(?=.*\d) 是“必须含数字”的断言 |
整数/正整数验证 | 整数:^-?\d+$ 正整数:^\d+$ | 整数:匹配正负整数 ✅正确:123、-456、0 ❌错误:123.45(含小数点)、-0(负0,无意义) | 若需要排除0,正整数可改为 ^[1-9]\d*$ |
身份证号(18位,含X) | `^(?:\d{17}[\dXx] | \d{15})$`匹配18位身份证(最后一位可是数字或X/x)或15位旧身份证 ✅正确:110101199001011234、11010119900101123X ❌错误:11010119900101123(少1位)、1101011990010112345(多1位) | 仅验证格式,不验证生日合法性和校验位(如需严格验证,需结合代码逻辑) |
匹配URL(简单版) | ^https?://\w+(\.\w+)+(/.*)?$ | 匹配HTTP/HTTPS开头的网址 ✅正确: https://www.baidu.com ❌错误:www.baidu.com(无http/https)、ftp://xxx.com(非http协议) | 适合快速过滤URL,复杂URL(含特殊参数)需扩展 |
好了,本次的分享到这里就结束啦,希望对你有所帮助~