再也不用死背正则了,好用正则速记法

245 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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})?/

案例三:匹配所有非引号内空格

匹配字符串例子:"helloworld",只匹配引号前后的空格,不匹配引号内部的空格。这里可以用正向预查法,不捕获引号内的任何信息。[^"]*表示匹配非引号的其他字符。

/\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插件,有一些常规的正则可以直接使用。

image.png

谢谢观看🙏