摘要:如果传入的字符串与正则表达式匹配,返回,反之返回。根据正则表达式里面是否有,的行为有较大差异。六方法的参数可以是一个正则表达式,也可以是一个字符方法按照给定的正则表达式或者字符分割字符串,返回一个包含分割后的子串的数组。
与正则表达式相关的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
摘要:正则表达式等待匹配的字符这里可以输入任何继承了的类返回一个值说明是否匹配这里需要注意的是,和均不允许通过构造器新建一个对象。 前言 之前一直想要做一个自己的爬虫,然后从nba数据相关的网上【虎扑,腾讯,官网等,要视网站是否支持】爬点数据写数据分析和图形化展示。虽然年轻的时候就实现过这个功能,但是当时直接借用了一个网上现成的jar包,然后在那个基础上写了一个非常简陋的正则表达式来提取数据...
摘要:介绍这周开始学习老姚大佬的正则表达式迷你书,然后习惯性的看完一遍后,整理一下知识点,便于以后自己重新复习。感谢原书作者老姚,本文无意抄袭,只是作为自己知识点的整理,后续也会整理到自己的知识库网站中。等价于,表示出现次。 showImg(https://segmentfault.com/img/remote/1460000018530584?w=919&h=449); 介绍 这周开始学习...
阅读 1554·2019-08-30 13:18
阅读 1540·2019-08-29 12:19
阅读 2065·2019-08-26 13:57
阅读 4096·2019-08-26 13:22
阅读 1149·2019-08-26 10:35
阅读 2961·2019-08-23 18:09
阅读 2464·2019-08-23 17:19
阅读 650·2019-08-23 17:18