读书笔记:ES5-RegExp

RegExp类型

声明

一个正则表达式就是一个模式和标志的组合体
定义方式:字面量/构造函数

1
2
var reg1 = /[ba]ct/g;
var reg2 = new RegExp('[ba]ct','g');

模式:任何简单或复杂的正则表达式,可以包含字符类、限定符、分组、向前查找、反向引用
标志:i(不区分大小写) / g(全局模式应用于所有字符串) / m(多行模式到达文本末尾会继续查找下一行),每个表达式可以有一个或多个标志

构造函数方法参数都是字符串,所以正则表达式需要双重转义

字面量模式 构造函数字符串
/\[ba\]ct/ '\\[ba\\]ct'
/\d{2}/ '\\d{2}'
/\\hello/ '\\\\hello'

构造函数和字面量差异:
首先字面量方法不会调用构造函数
其次在ES3时字面量法共享同一个正则表达式实例,构造函数每次调用都是生成一个新的实例,会导致问题代码如下

1
2
3
for(var i=1; i<10; i++){
/cat/g.test('cathssjdhfhudhkshd')
}

全局模式下,当第二次查找的时候会从上次匹配项后面开始查找至结尾返回false
但是ES5之后规定字面量法像调用构造函数方法一样,每次创建新的实例

元字符

( ) [ ] { } \ | ? ^ $ * + .,若要展示元字符是需要转义的

-元字符
^ 匹配字符串的开始位置(写在单元项前),如果有m标志,也匹配\n\r之后的位置,即重新开始的一行字符串也算是开始位置

$ 匹配字符串的结束位置(写在单元项后),如果有m标志,也匹配\n\r之前的位置,即折行后的一行字符串末尾也算是结束位置

. 匹配除换行符(\n\r)以外的所有字符

\d 匹配数字,相当于[0-9]
\D 匹配非数字的字符,相当于[^0-9]
\w 匹配字母/数字/下划线,相当于[A-Za-z0-9_]
\W 匹配非字母数字下划线的字符,相当于[^A-Za-z0-9_]
\s 匹配任意不可见字符,空格/换行/制表等
\S 匹配任意可见字符
\b 匹配单词和空格间的位置,匹配的是位置而不是那个空格

\B 匹配非单词边界

-限制符
* 重复任意次,相当于{0,},例/zo*/能匹配z/zo/zoo
+ 重复1次或多次,相当于{1,},例/zo+/能匹配zo/zoo,但不能匹配z

? 重复0次或1次,相当于{0,1},例/do(es)?/能匹配’do’中的’do’也能匹配’does’/‘doeses’中的’does’

⚠️?还有个功能,当在任意限制符后面时* + ?{},匹配模式为非贪婪模式(默认是贪婪模式尽可能多的匹配),尽可能少的匹配

⚠️?结合()的其他功能:
(?:pattern) 非捕获的匹配,可以简化一丢丢|的用法

(?=pattern) 非捕获的匹配,正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串

(?!pattern) 非捕获的匹配,正向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串

(?<=pattern) 非捕获的匹配,反向肯定预查

(?<!pattern) 非捕获的匹配,反向否定预查

{n} 重复n次
{n,} 重复n次或者大于n次
{n,m} 重复n到m次

-其他
x|y 匹配x或y
[xy] 字符合集,匹配任意一个字符,例/[ba]ct/匹配bat或cat,.*在合集中没有特殊含义

[^xy] 反字符合集,匹配非xy的任意字符
[a-z] 字符范围

[^a-z] 反字符范围
[\b] 匹配一个退格,不要和\b混淆
(xy) 捕获分组

实例属性

global 全局标实
ignoreCase 忽视大小写标实
multiline 多行模式标实
lastIndex 开始搜索下一个匹配项的字符位置
source 正则表达式的字符串表示,无论声明用什么方式,该属性都是字面量形式的字符串表示

没有什么用,在声明正则时都标注了属性

实例方法

exec

专门为捕获组而设计
1⃣️返回包含匹配项信息的数组,第一项是匹配项,后面项是捕获组匹配项(若没有捕获组则数组只一项),是Array实例但是包含两个额外属性index(匹配项在字符串中的位置)input(应用正则的字符串)
2⃣️若没有匹配项返回null

⚠️g全局模式每次都返回一个匹配项,但是对同一个字符串多次调用exec会继续查找新的匹配项,否则非全局下每次都返回第一个匹配项

test

只想知道是否匹配,不关心其文本内容
返回值匹配true不匹配false

补充全局模式也适用于test

继承方法

toLocalString() toString()返回字面量的字符串表示

valueOf()返回正则本身

构造函数属性

适用于作用域中所有正则表达式,并跟随最近一次执行正则操作而改变
可以通过两种方式长属性名/短属性名访问,短属性名大都不是有效标识符,so必须用方括号法访问

长属性名 短属性名 说明
input $_ 最近一次要匹配的字符串
lastMatch $& 最近一次匹配项
lastParen $+ 最近一次匹配的捕获组
leftContext $` input中位于匹配项前的文本
rightContext $' input中位于匹配项后的文本
multiline $* 是否所有表达式都使用多行

浏览器的兼容性未测待定…

此外还存在9个用于存储捕获组的属性,访问方式依次是RegExp.$1RegExp.$2RegExp.$9,分别存储第一个、第二个…第九个捕获组
虽然调用test()只返回一个true,但是这些属性会自动填充

最后写一个0-10之间的数值,精确度可以到两位的例子