JS中与正则相关的方法

前面有一篇文章大体介绍了一下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; // 4

a.exec(str); // ["ab", "b", index: 5, input: "cbacbab", groups: undefined]

a.lastIndex; // 7 匹配结果后面没有了所以重置为0

a.exec(str); // null

a.lastIndex; // 0

test()方法

reg.exec(b)返回一个boolean值表示在b中能否匹配到reg(正则表达式),与正则的exec方法一样当正则为全局匹配的时候会根据属性lastIndex来匹配,返回信息。

var reg = /a/;

var a = 'edcba';

var c = 'ddd';

reg.test(a); // true

reg.test(c); // false

// 全局匹配的正则

var regG = /a/g;

var str = 'abcdabcd';

regG.test(str); // true

regG.lastIndex; // 1

regG.test(str); // true 这是从字符串位置1开始匹配的结果,并不是从新从字符串位置0开始匹配

regG.lastIndex; // 5

retG.test(str); // false

regG.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); // 1

a.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"]

猜你喜欢

转载自blog.csdn.net/letterTiger/article/details/80955975