前面有一篇文章大体介绍了一下JS中正则表达式,而使用正则表达式还需要配合JS中的相关方法,分别是String对象和RegExp对象的方法。今天就来具体介绍一下这些方法。
使用这则表达式的方法可以分为两类,一个是String的几个方法,还有一个就是RegExp对象自身的方法,分别有:
RegExp的方法有 exec test
String的方法有 match replace search split
这些方法中最复杂的就是exec这个方法,表面上和String的match方法很像但是不然。
正则的exec()与字符串的match()
当这个方发作用于非全局匹配的正则表达式的时候和String的match方法作用是一样的,会返回一个数组数组的第一个元素是正则表达式的匹配结果,第二个元素是正则表达式第一个子表达式(分组,用小括号括起来的表达式)的匹配结果,以此类推。结果数组还有index属性,input属性和groups属性,其中index表示的是匹配到的字符串第一个字符的index,input是执行匹配的字符串。以上这些属性和String.match方法返回的都一样。当匹配不到结果的时候两个方法返回的都是null。
var a = /a(\w)/;
var str = "cbacbab";str.match(a); // ["ac", "c", index: 2, input: "cbacbab", groups: undefined]a.exec(str); // ["ac", "c", index: 2, input: "cbacbab", groups: undefined]
当匹配全局正则表达式的时候这两个方法的表现则完全不同,match方法会一次返回所有的匹配结果并且不会有其它额外的信息,而exec则不同一次只会返回一个匹配的结果,但是结果中还会包含以上的信息。
exec在执行全局匹配的时候回从lastIndex开始匹配,匹配后会设置Regexp对象的lastIndex属性为匹配到的字符最后一个字符的下一个位置,当匹配不到结果的时候就会重置lastIdex属性值为0。
所以match在匹配全局正则表达式和非全局正则表达式的行为表现是不一样的(JS中这样的例子有很多,例如Array() 参数个数不一样导致的结果也不一样)。
var a = /a(\w)/g;
var str = "cbacbab";str.match(a); // ["ac", "ab"]a.exec(str); // ["ac", "c", index: 2, input: "cbacbab", groups: undefined],看第二个元素 'c' 这就是(\w)子表达式捕获的字符串a.lastIndex; // 4a.exec(str); // ["ab", "b", index: 5, input: "cbacbab", groups: undefined]a.lastIndex; // 7 匹配结果后面没有了所以重置为0a.exec(str); // nulla.lastIndex; // 0
test()方法
reg.exec(b)返回一个boolean值表示在b中能否匹配到reg(正则表达式),与正则的exec方法一样当正则为全局匹配的时候会根据属性lastIndex来匹配,返回信息。
var reg = /a/;var a = 'edcba';var c = 'ddd';reg.test(a); // truereg.test(c); // false// 全局匹配的正则var regG = /a/g;var str = 'abcdabcd';regG.test(str); // trueregG.lastIndex; // 1regG.test(str); // true 这是从字符串位置1开始匹配的结果,并不是从新从字符串位置0开始匹配regG.lastIndex; // 5retG.test(str); // falseregG.lastIndex; // 0 没有匹配的结果就重置了lastIndex为0
replace()方法
这个方法可以捕获分组,但是JS中的正则表达式并不能给分组命名,所以只能用分组的序号来捕获分组。
var a = 'abcdefg';var reg = /c(de)/;a.replace(reg, '$1hhh'); // 这个$1就是捕获了分组 (de) 所以结果是 abdehhhfg
search()方法
在字符串a中搜寻字符串b,字符串b也可以是一个描述字符串的正则表达式。返回的是字符串b在a中的起始位置,如果搜索不到那么就会返回-1,和在数组中使用indexOf查找元素一样找不到会返回-1。
var a = 'abcd';var reg = /b/;a.search(reg); // 1a.search('e'); // -1
split()方法
a.split(b) 根据b分割a,返回一个数组。b可以是一个字符串也可以是一个描述字符串的正则表达式。
var a = 'ab cd ef';a.split(' '); // ["ab", "cd", "ef"]a.split(/\s+/); // ["ab", "cd", "ef"]