正则表达式相干的API

与正则表达式相干的API有以下7个:

  • RegExp.prototype​.test()
  • RegExp.prototype​.exec()
  • String​.prototype​.search()
  • String​.prototype​.match()
  • String​.prototype​.matchAll()
  • String​.prototype​.split()
  • String​.prototype​.replace()

在我们展开到各个要领之前,先来看一下在JavaScript内里定义一个正则表达式的两种体式格局:
1:字面量

let reg = /\d[a-z]/ig;

2:new一个RegExp()对象

let reg = new RegExp(/\d[a-z]/, 'ig');

上面的2种体式格局定义的正则表达式,关于我们接下来要讲的6个要领都是实用的。
一:RegExp.prototype​.test()
test()的参数是一个字符串,返回效果为布尔值。如果传入的字符串与正则表达式婚配,返回true,反之返回false。

let reg = new RegExp(/\d[a-z]/, 'ig');
reg.test('1a'); // true
reg.test('a1'); //false

二:RegExp.prototype​.exec()
exec()接收一个字符串为参数,如果有婚配的,返回一个数组,如果没有婚配则返回null。依据正则表达式内里是不是有'g',exec()的行动有较大差别。接下来我们都议论都是假设有婚配的状况:
1: 如果无'g',则返回一个数组,包括第一个婚配到的子串,更新index,然则不再继承婚配
2: 如果有'g',

1: 第一次实行exec(),则返回包括第一个婚配到的子串,更新index;
2: 等下一次再实行exec()时刻,从index的位置最先继承婚配。
3: 如果没有可再婚配的,则返回null,把index设置为0

看到这里,能够有人会迷惑,为何上面会提到下一次再实行exec()。由于,在有’g’的状况下,如果我给定的字符串有2处婚配,然则实行一次exec()实在只会获得一个婚配的子串,并不会一次性就把一切能婚配到的子串返回。所以,你得屡次挪用exec(),才保证获得一切可婚配的子串。接下来我们就用代码来申明一下:

let str = 'can you open a can?';

let regexp = /can/ig;

let result = regexp.exec(str);
console.log(result);

我们获得效果:

["can", index: 0, input: "can you open a can?", groups: undefined]

认识里,我们能够以为会获得两个婚配(一个开首的'can'和句子末端的'can'),然则事实是,哪怕是有'g'的状况下,你每挪用一次exec()只会获得一个婚配效果。如果想到获得一切的婚配效果,我们就得轮回挪用exec():

let str = 'can you open a can?';

let regexp = /can/ig;

let result;
while (result = regexp.exec(str)) {
    console.log(result)
}

我们获得效果:

["can", index: 0, input: "can you open a can?", groups: undefined]
["can", index: 15, input: "can you open a can?", groups: undefined]

三:String​.prototype​.search()
search()参数为一个正则表达式,返回值为第一个婚配的index,如果没有任何婚配,则返回-1

let str = 'can you open a can?';
let regexp = /can/ig;
let regexp2 = /abc/ig;
console.log(str.search(regexp)); // 0
console.log(str.search(regexp2)); // -1

关于search()须要记着的是:它只返回第一个婚配的index,一旦找到就会住手搜刮,不会再继承查找。

四:String​.prototype​.match()
match()要领也是会依据正则表达式是不是带有’g’而表现得差别,我们能够先看一段代码对照一下:

let str = "Can you open a can";
let result = str.match( /can/i );
let result2 = str.match(/can/ig);
let result3 = str.match(/abc/ig);
console.log( result );//["Can", index: 0, input: "Can you open a can", groups: undefined]
console.log( result2 );// ["Can", "can"]
console.log( result3 );//null

我们从以上的result,result2,result3的效果能够得出match()的行动为

1: 当没有'g'时,会以数组的情势返回第一个婚配的子串,以及一些附加信息
2: 当有'g'时,会以数组的情势返回一切婚配的子串,然则没有附加信息
3: 如果没有婚配的子串,返回null

关于match()完整地行动,须要结合著婚配组的学问一同看:正则表达式捕捉组
五:String.prototype.matchAll()
matchAll()还迥殊新,并非一切的浏览器都支撑了,这里先暂时不议论。今后再来补充。
六:String​.prototype​.split()
split()要领的参数能够是一个正则表达式,也能够是一个字符;split()要领根据给定的正则表达式或许字符支解字符串,返回一个包括支解后的子串的数组。

let str = "Can-you-open-a-can";
console.log(str.split(/-/)); //["Can", "you", "open", "a", "can"]

七:String​.prototype​.replace()

    原文作者:nanaistaken
    原文地址: https://segmentfault.com/a/1190000019046330
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞