- RegExp
- RegExp 对象的属性
- compile
- test
- exec
- String

RegExp 对象表示正则表达式, 主要用于对字符串执行模式匹配.
语法: new RegExp(pattern[, flags])
参数 pattern
是一个字符串, 指定了正则表达式字符串或其他的正则表达式对象。
参数 flags
是一个可选的字符串,包含属性 g
、i
和 m
,分别用于指定全局匹配、区分大小写的匹配和多行匹配。如果 pattern
是正则表达式,而不是字符串,则必须省略该参数。
var pattern = "[0-9]";
// 构造正则表达式对象
var reg = new RegExp(pattern,"g");
var reg = new RegExp("[0-9]","g");
// 也可以直接输入字面量
var reg = /[0-9]/g;
RegExp 对象的属性
包含如下属性:
实例属性描述global是否包含全局标志(true/false)ignoreCase是否包含区分大小写标志(true/false)multiline是否包含多行标志(true/false)source返回创建RegExp对象时指定的表达式文本字符串形式lastIndex表示原字符串中匹配的字符串最后一个字符后面的位置,默认为0flags(ES6)返回正则表达式的修饰符sticky(ES6)是否设置了y(粘连)修饰符(true/false) compilecompile 方法用于在执行过程中改变和重新编译正则表达式。
语法:compile(pattern[, flags])
参数介绍请参考上述 RegExp 构造器,用法如下:
var reg = new RegExp("abc", "gi");
var reg2 = reg.compile("new abc", "g");
console.log(reg); // /new abc/g
console.log(reg2); // undefined
可见 compile 方法会改变原正则表达式对象,并重新编译,而且它的返回值为空。
testtest 方法用于检测一个字符串是否匹配某个正则规则,只要是字符串中含有与正则规则匹配的文本,该方法就返回 true,否则返回 false。
语法:test(string)
用法如下:
console.log(/[0-9]+/.test("abc123")); // true
console.log(/[0-9]+/.test("abc")); // false
以上,字符串”abc123” 包含数字,故 test 方法返回 true;而字符串”abc” 不包含数字,故返回 false。
实际上,如果正则表达式带有全局标志(带有参数 g)时,test 方法还受正则对象的 lastIndex
属性影响,如下:
var reg = /[a-z]+/; // 正则不带全局标志
console.log(reg.test("abc")); // true
console.log(reg.test("de")); // true
var reg = /[a-z]+/g; // 正则带有全局标志g
console.log(reg.test("abc")); // true,成功匹配到字符串 abc
console.log(reg.lastIndex); // 3, 最近 1 次匹配到的字符串最后 1 个字符后面的位置。下次运行 test 时,正则引擎将从索引为 3 的位置开始查找
console.log(reg.test("de")); // false,reg 对象的属性 lastIndex 的值为 3,所以只会从位置 3 开始尝试匹配,而字符串“de”根本就没有位置 3,所以直接匹配失败
exec
语法:exec(string)
exec()
方法的功能非常强大,它是一个通用的方法,而且使用起来也比 test()
方法以及支持正则表达式的 String
对象的方法更为复杂。
如果 exec()
找到了匹配的文本,则返回一个结果数组。否则,返回 null
。此数组的第 0
个元素是与正则表达式相匹配的文本,第 1
个元素是与 RegExpObject
的第 1
个子表达式相匹配的文本(如果有的话),第 2
个元素是与 RegExpObject
的第 2
个子表达式相匹配的文本(如果有的话),以此类推。除了数组元素和 length
属性之外,exec()
方法还返回两个属性。index
属性声明的是匹配文本的第一个字符的位置。input
属性则存放的是被检索的字符串 string
。我们可以看得出,在调用非全局的 RegExp
对象的 exec()
方法时,返回的数组与调用方法 String.match()
返回的数组是相同的。
但是,当 RegExpObject
是一个全局正则表达式时,exec()
的行为就稍微复杂一些。它会在 RegExpObject
的 lastIndex
属性指定的字符处开始检索字符串 string
。当 exec()
找到了与表达式相匹配的文本时,在匹配后,它将把 RegExpObject
的 lastIndex
属性设置为匹配文本的最后一个字符的下一个位置。这就是说,您可以通过反复调用 exec()
方法来遍历字符串中的所有匹配文本。当 exec()
再也找不到匹配的文本时,它将返回 null
,并把 lastIndex
属性重置为 0
。
var reg = /([a-z]+)/gi,string = "World Internet Conference";
var array = reg.exec(string);
console.log(array); // ["World", "World", index: 0, input: "World Internet Conference"]
console.log(RegExp.$1); // World
console.log(reg.lastIndex); // 5, 刚好等于 array.index + array[0].length
如上代码,可以看到 reg.lastIndex == array.index(匹配开始的位置)+ array[0].length(匹配字符串的长度)。
随着检索继续, array.index 的值会变成下个匹配字符串的开始位置, 相应地 reg.lastIndex 的值会变成下个匹配字符串的结束位置。我们也可以通过反复调用 exec 方法来遍历源字符串中所有的匹配字符串,直到 exec 方法再也匹配不到文本时,它将返回 null,并把 reg.lastIndex 属性重置为 0。
array = reg.exec(string);
console.log(array);//["Internet", "Internet", index: 6, input: "World Internet Conference"]
console.log(reg.lastIndex);//14
array = reg.exec(string);
console.log(array);//["Conference", "Conference", index: 15, input: "World Internet Conference"]
console.log(reg.lastIndex);//25
array = reg.exec(string);
console.log(array);//null
console.log(reg.lastIndex);//0
有的时候我们需要手动将 lastIndex 的值手动设置为 0,如下例子:
var reg = /[0-9]+/g,
str1 = "123abc",
str2 = "123456";
reg.exec(str1);
console.log(reg.lastIndex);//3
var array = reg.exec(str2);
console.log(array);//["456", index: 3, input: "123456"]
以上代码,正则式在匹配字符串 str2 时,期望的正确结果应该是“123456”,因此建议在第二次执行 exec 方法前,增加一句 reg.lastIndex = 0;
。
match,search,replace,split 方法请参考字符串API。