快速入门正则表达式
一、什么是正则表达式?
正则表达式(Regular Expression)是一种对字符串进行操作的逻辑公式,用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,用这个“规则字符串”来表达对目标字符串的一种过滤逻辑,它可以达到以下两种常用的目的:
1.从目标字符串中进行匹配,看其是否满足想要的条件
2.从目标字符串提取满足表达式的字符子串
二、为什么使用正则表达式?
说实话,最开始知道正则表达式还是通过大学时期所学专业的Boss——楚大爷。当时在写数据项描述的时候有一栏对于字段内容的格式限定,大概是这个样子↓↓↓
| 名称 | 类型 | 精度 | 有效范围 | 格式 | 度量单位 | 长度限制 | 缺省值 | 是否可为空 | 输入/输出 | 备注 |
|---|---|---|---|---|---|---|---|---|---|---|
| 商品编号 | int | NA | NA | ^\d{8}$ | NA | NA | NA | 否 | 仓库管理员输入 | 例如10000923 |
| 商品名称 | String | NA | NA | ^([\u4e00-\u9fa5])*$ | NA | 40 | NA | 否 | 仓库管理员输入 | 例如卫龙面筋 |
| 保质期 | int | NA | NA | ^\d{0,5}$ | NA | NA | NA | 否 | 仓库管理员输入 | 例如365天 |
| 商品进价 | double | 0.01 | >=0 | ^(\d+(.\d{2}+)?){8}$ | 元(¥) | NA | 0.00 | 否 | 仓库管理员输入 | 例如16.00元 |
| … | … | … | … | … | … | … | … | … | … | … |
暂不说其正确性(反正就是网上copy的),当时看的是一脸懵逼,这是什么玩意儿。后来在写功能的时候遇到了程序最开始学习代码必经的入门功能 登录注册,这种带有输入的功能必须对其输入格式有严格的要求,那么在写的时候咋整呢?if if if if 以及 && && && && (公交车老头看手机.jpg)但如果使用正则,我就可以一句话搞定↓↓↓
eg:常用的密码格式(字母开头,长度在6~18之间,只能包含字母、数字和下划线) :
^[a-zA-Z]\w{5,17}$
如果不想强制字母开头那就 ^\w{6,18}$ 看!是不是一下子比 if if if && && && 强多了(宇:“没有” 我:“你走!”)所以正则最直观的特点就是短,灵活,你可以用它来判断字符串是否符合要求、替换文本、提取字符串中满足条件的子串。
三、入门示例
在学习一样新东西的时候最直观的就看例子,正所谓眼见为实。比如从“祝愿women的祖国gengjia繁荣chang盛”中提取中文,用正则表达式写出来就是
[\u4e00-\u9fa5]+
再比如匹配QQ号是
[1-9][0-9]{4,}
四、元字符
可以使用 https://tool.oschina.net/regex/# 来测试上一节的正则表达式,对于测试而言可以输入任意字符进行匹配来校验正则表达式是否正确,那么在第二个QQ号匹配的时候可能会出以下情况↓↓↓
欸?什么情况我输入这一大串子虽然能提取出10086 但是对于这个字符串而言不是我想要的结果啊,别急,来给他加个龙头凤尾↓↓↓
^[1-9][0-9]{4,}$
哦吼~匹配不到了,因为它不满足QQ号的条件,那么这个“^” 和 “$” 是个什么玩意儿呢?这就是正则表达式的“元符号”
“^”代表匹配字符串的开始,“$”代表匹配字符串的结束,加上二者之后的意思就是对于目标字符串而言,如果满足该正则表达式就有匹配结果,如果整个目标字符串不满足那就歇逼。
除了这两个元字符之外还有几个比较常用的元字符,如下↓↓↓
| 代码/语法 | 说明 |
|---|---|
| . | 匹配除换行符以外的任意字符 |
| \w | 匹配字母或数字或下划线或汉字 |
| \s | 匹配任意的空白符 |
| \d | 匹配数字 |
| \b | 匹配单词的开始或结束 |
| ^ | 匹配字符串的开始 |
| $ | 匹配字符串的结束 |
“这有个 \d 表示匹配数字,数字就是0~9,那我可不可以把 [0-9] 换成 \d 呢?”
“陈独秀你坐下,可以的!”
^[1-9]\d{4,}$ #实验证明把[0-9]换成\d 是阔以的,因为十进制数字就是0~9嘛
如果想要匹配的内容和元字符冲突怎么办,比如这个 “.” 那就转义一下 “\.” 你还可以“^”、“$”、“\\”
将元字符大写就可以得到其反义,如下↓↓↓
| 代码/语法 | 说明 |
|---|---|
| \W | 匹配任意不是字母,数字,下划线,汉字的字符 |
| \S | 匹配任意不是空白符的字符 |
| \D | 匹配任意非数字的字符 |
| \B | 匹配不是单词开头或结束的位置 |
| [^x] | 匹配除了x以外的任意字符 |
| [^aeiou] | 匹配除了aeiou这几个字母以外的任意字符 |
五、重复
之前几节中就是用到过重复,+、{4,} 前者表示 “+” 符号前第一个条件重复一次及以上,后者表示 “{4,}” 前第一个条件(第一个表示重复限定符前最近的条件,如 \w\d+ "+"是指 “\d” 条件重复一次及以上),下面给出常用重复限定符↓↓↓
| 代码/语法 | 说明 |
|---|---|
| * | 重复零次或更多次 |
| + | 重复一次或更多次 |
| ? | 重复零次或一次 |
| {n} | 重复n次 |
| {n,} | 重复n次或更多次 |
| {n,m} | 重复n到m次 |
六、后续学习
其实掌握之前内容就已经算是简单的入门了,还有一些分支条件、分组、后向引用、零宽断言、贪婪匹配等可以作为后续学习内容,个人感觉正则表达式是程序学习路上的基本素养之一,虽然现在那些常用的正则一搜一大把,但是对于千变万化的需求来讲,终会碰到那些搜不到的,而自己写就是最好的办法,也建议多分析分析他人写的正则来提高自己的水平,我也会把一些比较好的学习文章以及常用的正则表达式放在下方,大家一起学习。
1、https://deerchao.cn/tutorials/regex/regex.htm 超级棒的正则学习教程
2、https://tool.oschina.net/regex/# 在线正则表达式测试
3、https://blog.csdn.net/macwx/article/details/95166848 常用正则表达式
4、https://www.cnblogs.com/zxin/archive/2013/01/26/2877765.html 常用正则表达式