开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第7天,点击查看活动详情
不知道小伙伴们平时遇到需要正则匹配的需求时,是直接去百度找答案,还是有其他的好办法。本篇将结合几个实际案例,教大家如何快速记忆正则表达式,经理再也不用担心我手忙脚乱了。
正则基础知识
既然要讲正则,首先得熟悉正则的基本规则,如果你已经对正则很熟悉了,可以跳过这部分。
什么是正则表达式?可以描述为一种字符串匹配的模式,可以用来检查是否含有某个串或将匹配的串提取或替换。现实可用于表单输入格式校验、文字模板匹配等。
基本表达式
表达式 | 描述 |
---|---|
[0-9] | 数字 |
[a-zA-Z] | 大小写英文字母 |
[\u4e00-\u9fa5] | 中文 |
[\d\D] | \d等同于数字,\D表示非数字 |
[\s\S] | \s匹配所有空白符包括换行,\S非空白符不包括换行 |
[\w\W] | \w匹配字母、数字、下划线等价于[0-9a-zA-Z_],\W表示除字母、数字、下划线之外 |
特殊字符
使用特殊字符本身,请在特殊字符前加\进行转义:
字符 | 描述 |
---|---|
$ | 匹配字符串结尾位置 |
^ / [^] | 匹配字符串开始位置,在方括号中表示非括号内字符 |
() | 标记一个子表达式的开头和结尾位置 |
* | 匹配前一个表达式零次或多次 |
+ | 匹配前一个表达式一次或多次 |
. | 匹配除\n以外的任意单字符 |
? | 匹配前一个表达式零次或一次 |
\ | 转义符 |
| | 表示或 |
贪婪匹配
一般情况用通配符来匹配时,会匹配到尽可能多的字符,称之为贪婪匹配,例如/a.*b/匹配abcdefgb,会匹配到整个字符串而不是ab。
非贪婪匹配
匹配到尽可能少的字符,称之为非贪婪匹配,例如/a.*?b/匹配abcdefgb,会匹配到ab。 常用的非贪婪匹配的几种格式如下:
- *?重复任意次数,尽可能匹配最少次数
- +?重复最少一次或更多,尽可能匹配最少次数
- ??重复零次或一次,尽可能匹配最少次数
- {n,m}?重复n到m次,尽可能匹配最少次数
- {n,}?重复n次及以上,尽可减少配最少次数
零宽断言
零宽断言表示捕获的内容前后必须是特定内容,但不捕获这些特定内容,主要的表达式有?=、?!、?<=、?<!。
(?=pattern)正向肯定预查,表示匹配的字符要满足预查中的条件,例如/javascript(?=3)/只能匹配javascript3中的javascript,不能匹配到javascript2中的javascript。
(?!pattern)正向否定预查刚好相反,表示匹配的字符必须不满足预查中的条件,例如/javascript(?!3)/只能匹配非javascript3中的javascript。
(?<=pattern)反向肯定预查,表示匹配内容之前需要满足的预查条件,和正向匹配方向相反,例如/(?<=java)script/只能匹配javascript中的script,不能匹配到escript。
(?<!pattern)反向否定预查,表示匹配内容之前必须不满足预查中的条件,例如/(?<!java)script/不能匹配javascript中的script。
案例学习,加深记忆
案例一:非0正整数
首先分析一下,第一位数不能出现0,其他位数可以是任意数字。其中*表示匹配零次或多次。
/[1-9][0-9]*/
案例二:正数且最多保留两位数
小数点之前的数字为0或者非0正整数,小数点之后有1到2个数字。其中?表示匹配零次或一次。
/0|([1-9][0-9]*)(.[0-9]{1,2})?/
案例三:匹配所有非引号内空格
匹配字符串例子:"helloworld",只匹配引号前后的空格,不匹配引号内部的空格。这里可以用正向预查法,不捕获引号内的任何信息。[^"]*表示匹配非引号的其他字符。
/\s+(?=([^"]*"[^"]*")*[^"]*$)/g
案例四:匹配html标签内的内容
匹配字符串例子:
<a>123<div>456</div></a><div>789</div>
最后匹配到123、456、789。正则表达式要点:
- 用零宽断言判断,匹配内容前面用反向断言,匹配内容后面用正向断言。
- <[^>]*>用来匹配任意闭合和非闭合标签
/(?<=<[^>]*>)[^<>]*(?=<[^>]*>)/g
案例五:匹配最里面括号内的字符
匹配字符串例子:0(1(2)3)4(5)6,最后得到25。
- 记住零宽断言不包含断言内容,?<=放在匹配内容之前,?=放在匹配内容之后。
- 括号是特殊字符需要在前面加一个\
/(?<=\()[^\(\)]*(?=\))/g // 不包括括号
/\([^\(\)]*\)/g // 包括括号
最后,推荐vscode中的any-rule插件,有一些常规的正则可以直接使用。
谢谢观看🙏