Javascript正则表达式及特殊字符的收录

114 阅读2分钟

前言

这里收录了常用的JavaScript正则表达式,方便大家,还有我自己😂以后进行查阅。下面按照目录进行介绍。以后这篇文档会进行不断补充。

分类

常用匹配符

常用匹配符
?{0,1} 匹配0次或1次
*{0, } 匹配0次或多次
+{1, }匹配1次或多次
.*贪婪模式,任意字符出现0次或多次 ,比如a.*b,将会匹配最长的以a开头,以b结尾的字符串,假如要匹配aabab,会匹配全部的字符串aabab
.*?懒惰模式,以最短的任意字符满足正则匹配条件,还是比如a.*?b,将会匹配最短的以a开头, 以b结尾的字符串,匹配aabab,会匹配出aab、ab
.+?也是懒惰模式,但是和.*?不同的差别是,至少要存在1个任意字符,还是a.+?b,将会匹配最短的以a开头,以b结尾,中间至少一个字符,假如匹配abaab,会匹配abaab,而不是ab

断言

在讲解断言开始之前,想提示一下如果项目中需要处理safari 14+Firefox 70+等浏览器的兼容性,就不能使用?<=、?<!,否则会出现以下报错问题。解决办法就是用其他方式代替这种后行断言的写法。 SyntaxError: invalid regexp group

断言属于零宽度匹配,即这个位置的前面或者后面符合一个正则表达式,记住,是位置。所以在匹配结果中是不包含断言()里的结果。下面用几个栗子来分别介绍下。

?=

?.属于先行断言,即此位置的后面符合一个子表达式。

var reg = /ab(?=[A-Z])/; // ab字符后面是一个大写字母
"abZW863".match(reg) // 匹配结果是"ab",不是"abZ"

?!

?!也属于先行断言,即此位置的后面不能符合一个子表达式。

var reg = /ab(?![A-Z])/; // ab字符后面不能是一个大写字母
"abZW863".match(reg) // 匹配结果是null

?<=

?<=属于后行断言,即此位置的前面符合一个子表达式。

var reg = /(?<=name:)gwf/; // gwf字符的前面满足name:
"name:gwf".match(reg) // 匹配结果是"gwf",不是"name:gwf"

?<!

?<!也属于后行断言,即此位置的前面不能符合一个子表达式。

var reg = /(?<!name:)gwf/; // gwf字符的前面不能是name:
"name:gwf".match(reg) // 匹配结果是null,不符合条件

断言的功能是很强大的,用的时候可以进行多次摸索,看看哪种用法符合条件。

特殊字符

目前用的特殊字符比较少,往后会往里面补充⌛⌚🫥

特殊字符
\s任意的空白符

位置符

分隔符 \b

\b不捕获任意的字符(空格、换行,显式字符等),只是匹配一个位置,和上面介绍的断言一样,也是零宽度匹配。

它匹配的位置是:

它的前一个字符和后一个字符必须是\w(字母数字下划线)和\W(非字母数字下划线),即匹配必须出现在\w和\W字符之间的边界上。

比如"ssssabssss",想要匹配出字符串"ab",不能使用/\bab\b/g,匹配结果是null。因为在"ssssabssss"中的"ab"前后是符合\w的,不是\W。

如果想要匹配"It is holiday!"中的"holiday",可以用/\bholiday\b/g,匹配结果是"holiday"。

行起始符 ^ 和 行结束符 $

行起始符^和行结束符$也是只匹配位置,不捕获任意的字符。可以用于匹配以什么开头或者以什么结尾的正则,比如下面的:

"function hello(){return 'word'}".match(/^function.+}$/g) //匹配以function开头,以}结尾的函数体

参考文章

浅析正则表达式用法:零宽断言(?=、?<=、?!、?<!)

正则表达式\b

一个别人家的博客