前言
这里收录了常用的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开头,以}结尾的函数体