资讯专栏INFORMATION COLUMN

正则表达式相关的API

MobService / 1928人阅读

摘要:如果传入的字符串与正则表达式匹配,返回,反之返回。根据正则表达式里面是否有,的行为有较大差异。六方法的参数可以是一个正则表达式,也可以是一个字符方法按照给定的正则表达式或者字符分割字符串,返回一个包含分割后的子串的数组。

与正则表达式相关的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()

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/104028.html

相关文章

  • 正则达式 深入浅出2--从java API开始

    摘要:正则表达式等待匹配的字符这里可以输入任何继承了的类返回一个值说明是否匹配这里需要注意的是,和均不允许通过构造器新建一个对象。 前言 之前一直想要做一个自己的爬虫,然后从nba数据相关的网上【虎扑,腾讯,官网等,要视网站是否支持】爬点数据写数据分析和图形化展示。虽然年轻的时候就实现过这个功能,但是当时直接借用了一个网上现成的jar包,然后在那个基础上写了一个非常简陋的正则表达式来提取数据...

    andycall 评论0 收藏0
  • H5学习

    摘要:为此决定自研一个富文本编辑器。本文,主要介绍如何实现富文本编辑器,和解决一些不同浏览器和设备之间的。 对ES6Generator函数的理解 Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同。 JavaScript 设计模式 ② 巧用工厂模式和创建者模式 我为什么把他们两个放在一起讲?我觉得这两个设计模式有相似之处,有时候会一个设计模式不能满...

    aristark 评论0 收藏0
  • 《JavaScript 正则达式迷你书》知识点小抄本

    摘要:介绍这周开始学习老姚大佬的正则表达式迷你书,然后习惯性的看完一遍后,整理一下知识点,便于以后自己重新复习。感谢原书作者老姚,本文无意抄袭,只是作为自己知识点的整理,后续也会整理到自己的知识库网站中。等价于,表示出现次。 showImg(https://segmentfault.com/img/remote/1460000018530584?w=919&h=449); 介绍 这周开始学习...

    zollero 评论0 收藏0

发表评论

0条评论

MobService

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<