# 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].*$/  //匹配汉字开头