# js正则知识梳理
# 1、元字符
即在正则表达式中有特殊含义的字符,使用前必须转义
* + ? $ ^ . | \ ( ) {} [ ]
# 2、类
# 2.1 普通类
[abc]
表示匹配a或b或c
# 2.2 反向类
[^abc]
^在前面则表示非a或者非b或者非c
[a^bc]
^不在前面 则失去特殊意义 表示 a或^或b或c
# 2.3 范围类
[a-z]
表示a-z的小写字母
[a-zA-Z]
表示a-z或A-Z的字母
[a-z1-5]
表示a-z或1-5的字符
[0-9-]
表示0-9或"-"
# 2.4 预定义类
预定义类 | 等价类 | description |
---|---|---|
. | [^\r\n] | 除换行和回车的所有字符 |
\d | [0-9] | |
\D | [^0-9] | |
\s | [\t\n\v\f\r] | 所有的空白符(制表符、换行符、垂直制表符、换页符、回车符) |
\S | [^\t\n\v\f\r] | 非空白符 |
\w | [a-zA-Z_0-9] | 单词字符(字母数字下划线) |
\W | [^a-zA-Z_0-9] | 非单词字符 |
# 3、边界
边界 | description |
---|---|
^ | 以xx开始(类中表示取反) |
$ | 以xx结束 |
\b | 单词边界 |
\B | 非单词边界 |
# 4、量词
边界 | description |
---|---|
? | 出现0次或1次(最多一次) |
+ | 出现一次或多次(至少一次) |
* | 出现0次或多次(任意次) |
{n} | 出现n次 |
{n,m} | 出现n到m次 |
{n,} | 至少出现n次 |
# 5、贪婪模式与非贪婪模式
正则表达式会尽可能多的匹配直到匹配失败
举个🌰:
'123456789'.match(/\d{3,6}/g)
=>"123456","789"
量词加?关闭贪婪模式:
'123456789'.match(/\d{3,6}?/g)
=>"123","456","789"
# 6、| 或
abc|def
=> "abc"或"def"
ab(c|d)ef
=> ab c或d ef
# 7、分组
量词可作用于分组
举个🌰:
(123){3}
匹配出现了三次123
$
表示分组的变量 ($&
可以表示匹配到的字符串)
"2017-11-20"替换为"20/11/2017":
"2017-11-20".replace(/(\d{4})-(\d{2})-(\d{2})/g
,"$3/$2/$1")
忽略分组 不需要捕获某些分组 只需在分组内加上?:
"2017-11-20".replace(/(?:\d{4})-(\d{2})-(\d{2})/g
,"$2/$1")=>'20/10'
# 8、前瞻与后顾(或称先行断言/后行断言)
正则表达式从文本头部向尾部解析,文本尾部方向,称为‘前’,前瞻就是正则表达式匹配到符号规则的时候, 向前检查是否符合断言。后顾与前瞻方向相反。符合断言称为肯定/正向匹配,不符合断言称为否定/负向匹配(js不支持后顾) 在未来将发布es2018版本,js正则已经支持后顾了~而且现在的chrome64已经全面支持
类别 | 语法 |
---|---|
正向前瞻 | reg(?=assert) |
负向前瞻 | reg(?!assert) |
正向后顾 | reg(?<=assert) |
负向后顾 | reg(?< !assert) |
举个🌰:
'a2b'.match(/[a-z](?=\d)/g
) => 'a'
'a2b'.match(/[a-z](?!\d)/g
) => 'b'
# 9、一些🌰
/^[\u4E00-\u9FFF].*$/ //匹配汉字开头