首页 > 其他分享 >[转]js 正则相关的两个方法match和exec的区别

[转]js 正则相关的两个方法match和exec的区别

时间:2024-01-23 09:24:27浏览次数:27  
标签:返回 匹配 exec js 数组 文本 match

原文地址:js match和exec的区别_javascript match exec-CSDN博客

一、使用方法不同
exec() 是正则对象的方法;reg.exec(str);
match() 是字符串的正则表达方法; str.match(reg);
二、返回结果不同
w3cSchool 是这么说的:

match() 方法将检索字符串 stringObject,以找到一个或多个与 regexp 匹配的文本。这个方法的行为在很大程度上有赖于 regexp 是否具有标志 g。

如果 regexp 没有标志 g,那么 match() 方法就只能在 stringObject 中执行一次匹配。如果没有找到任何匹配的文本, match() 将返回 null。否则,它将返回一个数组,其中存放了与它找到的匹配文本有关的信息。该数组的第 0 个元素存放的是匹配文本,而其余的元素存放的是与正则表达式的子表达式匹配的文本。除了这些常规的数组元素之外,返回的数组还含有两个对象属性。index 属性声明的是匹配文本的起始字符在 stringObject 中的位置,input 属性声明的是对 stringObject 的引用。

如果 regexp 具有标志 g,则 match() 方法将执行全局检索,找到 stringObject 中的所有匹配子字符串。若没有找到任何匹配的子串,则返回 null。如果找到了一个或多个匹配子串,则返回一个数组。不过全局匹配返回的数组的内容与前者大不相同,它的数组元素中存放的是 stringObject 中所有的匹配子串,而且也没有 index 属性或 input 属性。

注意:在全局检索模式下,match() 即不提供与子表达式匹配的文本的信息,也不声明每个匹配子串的位置。如果您需要这些全局检索的信息,可以使用 RegExp.exec()。
-------------------------------------------------------------------------
exec() 方法的功能非常强大,它是一个通用的方法,而且使用起来也比 test() 方法以及支持正则表达式的 String 对象的方法更为复杂。

如果 exec() 找到了匹配的文本,则返回一个结果数组。否则,返回 null。此数组的第 0 个元素是与正则表达式相匹配的文本,第 1 个元素是与 RegExpObject 的第 1 个子表达式相匹配的文本(如果有的话),第 2 个元素是与 RegExpObject 的第 2 个子表达式相匹配的文本(如果有的话),以此类推。除了数组元素和 length 属性之外,exec() 方法还返回两个属性。index 属性声明的是匹配文本的第一个字符的位置。input 属性则存放的是被检索的字符串 string。我们可以看得出,在调用非全局的 RegExp 对象的 exec() 方法时,返回的数组与调用方法 String.match() 返回的数组是相同的。

但是,当 RegExpObject 是一个全局正则表达式时,exec() 的行为就稍微复杂一些。它会在 RegExpObject 的 lastIndex 属性指定的字符处开始检索字符串 string。当 exec() 找到了与表达式相匹配的文本时,在匹配后,它将把 RegExpObject 的 lastIndex 属性设置为匹配文本的最后一个字符的下一个位置。这就是说,您可以通过反复调用 exec() 方法来遍历字符串中的所有匹配文本。当 exec() 再也找不到匹配的文本时,它将返回 null,并把 lastIndex 属性重置为 0。

就是说,非全局的正则匹配下,match和exec的返回结果是一致的,但在全局匹配的情况下,match返回结果集数组,exec返回每一项匹配结果的详细信息,但如果需要所有的返回结果,则需要循环调用该方法。
————————————————
版权声明:本文为CSDN博主「想飞上天去和太阳肩并肩」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_39512863/article/details/119915909

其他参考文章:

2023-02-22 js中match和exec区别 - 简书

标签:返回,匹配,exec,js,数组,文本,match
From: https://www.cnblogs.com/dirgo/p/17981607

相关文章

  • Java开发者的Python进修指南:JSON利器之官方json库、demjson和orjson的实用指南
    JSONJSON作为目前最流行的传输格式,在Python中也有相应的实现方式。由于JSON格式的文本可以跨平台并且简单易用,因此被广泛传播。因此,我们今天的主要讨论内容是如何熟练地应用Python的JSON库来处理将JSON映射到文本,以及如何从文本映射到对象中。现在,让我们开始探讨这个话题。官方j......
  • 某建筑网页js逆向分析过程(有坑)
    某建筑网页js逆向分析过程(有坑)https://blog.csdn.net/ak_bingbing/article/details/134399056 acmakb于2023-11-1414:56:27发布阅读量709收藏点赞数4分类专栏:网络爬虫文章标签:javascript爬虫python版权网络爬虫专栏收录该内容20篇文章0订阅订阅专栏某建筑网......
  • crypto-js 加密、解密使用方法
    crypto-js加密、解密使用方法爱宇阳于2021-12-1015:35:32发布阅读量5.9w收藏201点赞数38分类专栏:VueJavaScriptHTML5文章标签:javascript前端vue.js版权华为云开发者联盟该内容已被华为云开发者联盟社区收录加入社区Vue同时被3个专栏收录81篇文章9订阅订阅......
  • JS 数字字符串补零
    有时为了格式美观,我们需要给数字统一格式,比如001,002,003,这就有了为数字补足0的需求。具体见代码//num:数字//fill:补足后的位数padNumber(num,fill){letlen=(''+num).length;if(fill>len){//新建一个空数组,长度为所缺位数+1,利用join(0),得......
  • 复杂JSON数据的扁平化解析_Java实现
    在工作中遇到了解析JSON数据的场景,但是此岗位传统的做法是通过Python脚本来实现的,而且是非常不合理的手动解析——每对应不同的JSON数据结构,都需要手动改动很多脚本文件,工作量与JSON数据结构的复杂程度成正比!(很难想象这是一个做开发的人想出来的方案)因此最开始接触此工作内容的时......
  • vscode windows CMakePresets.json
    vscode在windows下使用Ninja编译配置,使用VisualStudio编译环境。来源:CMakePresets.json参考:在VisualStudio中使用CMake预设进行配置和生成--示例文件CMakePresets.json{"version":2,"configurePresets":[{"name":"base","......
  • Python web crawler(2)json异步加载的格式
    异步加载的特点点击“查看更多”等按钮,浏览器“刷新”按钮无反馈效果。查看浏览器点击F12的“DevTools”开发者工具,点选“网络”——“Fetch/XHR”——每点击一次“加载更多”就会出现一次网络请求点击刷新出来的“请求内容”——点击“响应”,可以看到响应的是“字典”点击标......
  • numba cannot be imported and numba functions are disabled. Probably the executio
    问题描述运行代码会出现警告信息numbacannotbeimportedandnumbafunctionsaredisabled.Probablytheexecutionisslow.Pleaseinstallnumbatogainamassivespeedup.(orifyoupreferslowexecution,settheflagnumba=Falsetoavoidthiswarning!)即使......
  • CryptoJS 加密 解密
    npmicrypto-js--save加密和解密的方式要对应,比如都是Base64、CBC、Pkcs7constCryptoJS=require('crypto-js');//引入crypto-jsvarstr=JSON.stringify({a:1,b:2})varkey='o9oSSaSHMp7KD9S485vx5oThWKKR7vVsCXAl26xBz9w='variv=&......
  • js---格式化时间显示
    我们在做时间渲染的时候,经常会遇到需要将时间转为特定的显示方式,以下是常见的时间显示格式化方法:exportfunctionformateTime(timeStamp){timeStamp=timeStamp*1000;letdate=newDate(timeStamp);letyear=date.getFullYear();letmonth=date.g......