RegExp类型
5.4 RegExp类型
ECMAScript通过RegExp类型来支持正则表达式。
var expression = / pattern / flags ;
- g : 表示全局(global)模式,即模式将被应用于所有字符串,而非在发现第一个匹配时立即停止;
- i : 表示不区分大小写(case-insensitive)模式;
- m: 表示多行(multiline)模式,即在到达一行文本末尾时还会继续查找下一行中是否存在与模式匹配的项;
字面量模式中使用的所有元字符都必须转义。正则表达式中的元字符包括:( [ { \ $ | ) ? * + . ] }
构造函数中要用双重转义,才能使用。
// 匹配第一个"bat"或"cat",不区分大小写
// 字面量形式:
var pattern1 = / [bc]at /i;
// 构造函数创建的:
var pattern2 = new RegExp("[bc]at", "i");
在ECMAScript 3中,正则表达式字面量始终会共享同一个RegExp实例,而使用构造函数创建的每一个新RegExp实例都是一个新实例。
但是!!!!!!
ECMAScript 5明确规定,使用正则表达式字面量必须像直接调用RegExp构造函数一样,每次都创造新的RegExp实例。(这就是为什么后续跟着调试,字面量不会出现flase的原因 0 0. 时间:2020/4/1 js高程3 P105)。
5.4.1 RegExp 实例属性
- global:布尔值,表示是否设置了g标志。
- ignoreCase:布尔值,表示是否设置了i标志。
- lastIndex:整数,表示开始搜索下一个匹配项的字符位置,从0开始算起。
- multiline:布尔值,表示是否设置了m标志。
- source:正则表达式的字符串表示,按照字面量形式而非传入构造函数中的字符串模式返回。
5.4.2 RegExp实例方法
RexExp对象的主要方法是exec(), exex()接受一个要应用模式的字符串,然后返回包含第一个匹配项信息的数组;或者在没有匹配的情况下返回null。
返回的数组虽然是Array实例,但包含的两个额外的属性:index和input。
例子:
var text = "abb acc mom and dad and baby", pattern = /mom( and dad( and baby)?)?/gi; matches = pattern.exec(text); console.log(matches.index); //8 (index表示匹配项在字符串的位置) console.log(matches.input); //"abb acc mom and dad and baby" (input表示应用正则表达式的字符串) console.log(matches[0]); //"mom and dad and baby" (数组中第一项是与整个模式匹配的字符串) console.log(matches[1]); //" and dad and baby" (其他项是与模式中的捕获组匹配的字符串) console.log(matches[2]); //" and baby" (同上)
对于exec()方法而言,在不设置全局标志的情况下,在同一个字符串上多次调用exec()将始终返回第一个匹配项信息。而在设置全局标志的情况下,每次调用exec()则都会在字符串中继续查找新匹配项。lastIndex属性用于规定下次匹配的起始位置。
例子:
var text = "cat, bat, sat, fat", pattern1 = /.at/; var matches = pattern1.exec(text); console.log(matches.index); //0 console.log(matches.input); //cat, bat, sat, fat console.log(matches[0]); //cat console.log(pattern1.lastIndex); //0 matches = pattern1.exec(text); console.log(matches.index); //0 console.log(matches.input); //cat, bat, sat, fat console.log(matches[0]); //cat console.log(pattern1.lastIndex); //0 var pattern2 = /.at/g; var matches = pattern2.exec(text); console.log(matches.index); //0 console.log(matches.input); //cat, bat, sat, fat console.log(matches[0]); //cat console.log(pattern2.lastIndex); //3 matches = pattern2.exec(text); console.log(matches.index); //5 console.log(matches.input); //cat, bat, sat, fat console.log(matches[0]); //bat console.log(pattern2.lastIndex); //8
正则表达式的第二个方法是test(),接受一个字符串参数。在模式与该参数匹配的情况下返回ture;否则,返回false。
在只想知道目标字符串与某个模式是否匹配,但不需要知道内容,这个方法很方便。经常被用在 if 语句中。
例如:
var text = "000-00-0000"; var pattern = /\d{3}-\d{2}-\d{4}/; if (pattern.test(text)){ alert("hhhhh"); }
RegExp 实例继承的toLocaleString()和toString()方法都会返回正则表达式的字面量,与创建的方式无关。
valueOf()方法返回正则表达式本身。
var pattern = new RegExp("\\[bc\\]at","gi"); console.log(pattern.toString()); console.log(pattern.toLocaleString()); console.log(pattern.valueOf());
5.4.3 RegExp构造函数属性
var text = "this has been a short summer"; var pattern = /(.)hort/g; if (pattern.test(text)){ console.log(RegExp.input); console.log(RegExp.leftContext); console.log(RegExp.rightContext); console.log(RegExp.lastMatch); console.log(RegExp.lastParen); console.log(RegExp.multiline); } if (pattern.test(text)){ console.log(RegExp.$_); console.log(RegExp["$`"]); console.log(RegExp["$'"]); console.log(RegExp["$&"]); console.log(RegExp["$+"]); console.log(RegExp["$*"]); }
5.4.4 模式的局限性
见书P109