RegExp类型
es通过RegExp类型支持正则
- 字面量定义法:
var expression = /pattern/flags;复制代码
- pattern(模式)可包含字符类、限定符、分组(()围起来的部分)、向前查找以及反向引用。每个正则表达式都可带有==一或多个标志==(flags)
- g:全局模式,即模式将被应用于所有字符串,而非在发现第一个匹配项时立即停止
- i:表示不区分大小写模式,即在确定匹配项时忽略模式与字符串的大小写
- m:表示多行模式(不知道这到底是什么模式,和全局有啥区别。。。书上也没案例)
var pattern1 = /at/g;//匹配所有“at”的实例var pattern2 = /[bc]at/i;//匹配第一个“bat”或“cat”,不区分大小写var pattern3 = /.at/gi;//匹配所有以“at”结尾的3个字符的组合、不区分大小写复制代码
- 所有==元字符==必须转义: ([{^$|?*+.}])等
var pattern1 = /[bc]at/i;//匹配第一个“bat”或“cat”,不区分大小写var pattern2 = /\[bc\]at/i;//匹配第一个“[bc]at”,不区分大小写var pattern3 = /\.at/gi;//匹配所有“.at”,不区分大小写复制代码
- RegExp构造函数
接收两个参数:一个是要匹配的字符串模式,另一个是可选的标志字符串。字面量定义的任何表达式,都可以使用构造函数来定义
var pattern1 = /[bc]at/i;var pattern2 = new RegExp("[bc]at","i");复制代码
- 不能把正则表达式字面量传递给RegExp构造函数。因为RegExp接收的都是字符串,所以某些情况要对字符进行双重转义,==所有元字符都必须双重转义==,已转义的字符也要如此
RegExp实例属性
每个RegExp实例都有如下属性:
-
global:boolean,表示是否设置了g标志
-
ignoreCase:boolean,表示是否设置了i标志
-
==lastIndex:number,表示开始搜索下一个匹配项的字符位置,从0算起==
-
multiline:boolean,表示是否设置了m标志
-
==source:正则表达式的字符串表示,按照字面量形式而非传入构造函数中的字符串模式返回==
var pattern1 = /\[bc\]at/i;alert(pattern1.lastIndex);//0alert(pattern1.source);//"\[bc\]at"var pattern2 = new RegExp("\\[bc\\]at","i");alert(pattern2.lastIndex);//0alert(pattern2.source);//"\[bc\]at"复制代码
source所存都是字面量形式的字符串
RegExp实例方法
exec
-
exec():exec()接受一个参数,即要查询的字符串,然后返回包含第一个匹配项信息的数组;没有匹配项时,返回null。
-
返回的数组虽然是Array的实例,但包含两个额外的属性:index和input。其中,index表示匹配项在字符串中的位置,input表示查询的字符串(exec接受的参数)
-
在数组中,第一项是与整个模式匹配的字符串,其他项是与模式中的捕获组匹配的字符串。无捕获组则该数组只包含一项。(括号包含的就是捕获组)
捕获组就是把正则表达式中子表达式匹配的内容,保存到内存中以数字编号或显式命名的组里,方便后面引用。当然,这种引用既可以是在正则表达式内部,也可以是在正则表达式外部。一般一个小括号括起来就是一个捕获组。捕获组可以进行嵌套。以深度优先进行编号,在js中编号从1开始。
var text = "mom and dad and baby";var pattern = /mom( and dad( and baby)?)?/gi;var matches = pattern.exec(text);alert(matches.index);//0alert(matches.input);//"mom and dad and baby"alert(matches[0]);//"mom and dad and baby"alert(matches[1]);//" and dad and baby"alert(matches[2]);//" and baby"复制代码
捕获组有两个: and dad and baby; and baby
- 不设置g时,同一字符串上多次调用exec()将始终返回第一个匹配项的信息。设置g时,每次调用exec都会在字符串中继续查找新匹配项;即使设置了g,exec每次也只返回一个匹配项
var text = "cat, bat, sat, fat";var pattern1 = /.at/;var matches = pattern1.exec(text);alert(matches.index);//0alert(matches[0]);//catalert(pattern1.lastIndex);//0matches = pattern1.exec(text);alert(matches.index);//0alert(matches[0]);//catalert(pattern1.lastIndex);//0 (lastIndex:表示开始搜索下一个匹配项的字符位置。一直为0所以始终返回第一个匹配项的信息)var pattern2 = /.at/g;var matches = pattern2.exec(text);alert(matches.index); //0alert(matches[0]);//catalert(pattern2.lastIndex);//3复制代码
- g模式下,lastIndex在每次调用exec()后都会增加,而在非全局模式下始终保持不变
test
- 接受一个字符串参数,模式与该参数匹配的情况下返回true;否则返回false
var text = "000-00-0000";var pattern = /\d{3}-\d{2}-\d{4}/;if(pattern.test(text)){ alert("The pattern was matched.");}复制代码
toLocaleString()、toString()、valueOf()
- 这三个方法继承自Object。前两者都会返回==正则表达式的字面量==,与创建正则表达式的方式无关
var pattern = new RegExp("\\[bc\\]at","gi");alert(pattern.toString());// /\[bc\]at/gialert(pattern.toLocaleString());// /\[bc\]at/gi复制代码
- 第三个方法则是返回正则表达式本身:
RegExp构造函数的属性
-
构造函数所带的属性,适用于作用域中的所有正则表达式。并基于所执行的最近一次正则表达式操作而变化
-
这些属性可以通过两种方式访问
var text = "this has been a short summer";var pattern = /(.)hort/g;if(pattern.test(text)){ alert(RegExp.input);//this has been a short summer alert(RegExp.leftContext);//this has been a alert(RegExp.rightContext);// summer alert(RegExp.lastMatch);//short alert(RegExp.lastParen);//s alert(RegExp.multiline);//false}复制代码
-
如果要使用短属性名,则需要通过方括号语法来访问(因为大都不是有效的es标识符)
-
构造函数属性里还有9个用于存储捕获组,分别为RegExp.$1、RegExp.$2...
-
调用exec()或test()方法时,$1等属性会被自动填充
var text = "this has been a short summer";var pattern = /(..)or(.)/g;if(pattern.test(text)){ alert(RegExp.$1);//sh alert(RegExp.$2)l//t}复制代码
模式的局限性
以下是es正则表达式不支持的特性: