一直觉得正则表达式很难,平时遇到都是网上copy,最近刷犀牛书的时候看到了正则部分,正好整理下知识点!
1、重复
-
{n, m}: 匹配前一项至少n次,但不能超过m次 比如 /a{2,4}/
-
{n,}: 匹配前一项n次或者更多次 比如 /a{4,}/
-
{n}: 匹配前一项n次 比如 /a{4}/
-
?: 匹配前一项0次或者多次,等价于{0,1} 比如 /a?/
-
+: 匹配前一项1次或多次,等价于 {1,} 比如 /a+/
-
: 匹配前一项0次或多次,等价于{0,} 比如 /a/
2、选择
'()'用于把单独的项组合成子表达式,以便可以像处理一个独立的单元那样。
/java(script)?/ 可以匹配‘java’,其后可以有’script’,也可以没有
3、分组
带'()'的表达式可以可以被后边的表达式引用,分组的子表达式有按从左向右递增的编号,可以通过’\’后边加编号来对其进行引用,比如'\1'是对第1个分组子表达式的引用,'\n'是对第n个分组子表达式的引用。
比如,/(["'])[^"']*\1/ 是对被单引号或双引号包裹的内容进行匹配,且要求左右的引号一致,
这里如果用/["'][^"']["']/,并不能保证左右的引号一致。
需要注意的是,引用是指对匹配文本的引用,而不是对模式的引用。
若不想创建带编号的分组表达式,可以用'(?:)' 替代 '()',
注意,/(?:\w)/ 与 /(\w)/ 的区别,前者没有分组编号。
4、锚
锚,指的是位置,很多情况下需要指定匹配的位置,最常用的就是 '^' 和 '$'
- ‘^’ 指定匹配字符串的开始
- ’$’ 指定匹配字符串的结束
比较难理解的是 零宽正向先行断言 和 零宽负向先行断言
-
’(?=pattern)‘ 表示零宽正向先行断言,其中’pattern’是一个正则表达式
比如 /Java(?=Script)/,该正则表达式匹配 ‘JavaScript’ 中的 ‘Java’,但不会匹配
‘JavaPcript’ 中的 ‘Java’,也就是说,匹配位置的右边要匹配pattern这个正则。
所谓零宽,就是说'(?=pattern)' 中的 'pattern' 不会消耗匹配的字符,
举个例子
就是说 '/w'匹配到了'Script' 中的 'S',也就是'(?=Script)'没有消耗掉'Script'。
所谓先行断言,是指JavaScript引擎先于扫描指针去尝试匹配后续的字符串。
- '(?!pattern)' 表示零宽负向先行断言,与零宽正向先行断言类似,唯一的区别在于前者是不匹配pattern。
其实还有 零宽正向后行断言 和 零宽负向后行断言,不过JavaScript并不支持。
5、'\b' 与 '\B'
\b 匹配一个单词,所谓单词,就是指\w组成的字符串,也就是说,\b匹配的是\w与\W
之间的位置