首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

regex.exec(str)可以工作,但str.matchAll(正则表达式)不能

首先,让我们来解释一下这两个方法的作用和区别。

  1. regex.exec(str):这是一个正则表达式的方法,用于在给定的字符串中执行正则表达式的匹配操作。它返回一个数组,其中包含与正则表达式匹配的结果。如果没有找到匹配项,则返回null。
  2. str.matchAll(正则表达式):这是一个字符串的方法,用于在给定的字符串中查找所有与正则表达式匹配的子串。它返回一个迭代器对象,该对象包含所有匹配的结果。如果没有找到匹配项,则返回null。

现在回到问题本身,为什么regex.exec(str)可以工作,但str.matchAll(正则表达式)不能?

这是因为str.matchAll(正则表达式)是ES2020引入的新方法,而不是所有的浏览器和JavaScript运行环境都支持它。如果你的环境不支持该方法,调用它将会导致错误。

相比之下,regex.exec(str)是一个更早的方法,几乎所有的浏览器和JavaScript运行环境都支持它。因此,它更具可移植性和兼容性。

如果你想在不支持str.matchAll(正则表达式)的环境中使用类似的功能,你可以使用regex.exec(str)方法结合循环来实现类似的效果。下面是一个示例代码:

代码语言:txt
复制
const regex = /正则表达式/g;
let match;
while ((match = regex.exec(str)) !== null) {
  console.log(match[0]);
}

在上面的代码中,我们使用了一个循环来重复调用regex.exec(str)方法,直到没有匹配项为止。每次调用都会返回一个匹配结果,并将匹配结果打印出来。

总结一下,regex.exec(str)是一个通用且兼容性较好的方法,适用于大多数情况。而str.matchAll(正则表达式)是一个新的方法,需要确保你的环境支持它才能使用。如果你需要在不支持str.matchAll(正则表达式)的环境中使用类似的功能,可以使用regex.exec(str)方法结合循环来实现。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

JavaScript·正则匹配探究

match 是字符串方法,写法为:str.match(regex) exec 是正则表达式方法,写法为:regex.exec(str) 两者在匹配成功时返回的都是数组,在没有匹配上时返回的都是 null...console.log('exec2:', regex.exec(str)) console.log('exec3:', regex.exec(str)) // match1: [ 'aaa', '...仅返回第一次匹配成功的结果; 全局匹配时,match 会返回所有匹配上的内容;而 exec 仅匹配单次匹配上的内容,当多次匹配时,exec 会从上次匹配结束的下一位开始匹配,返回本次匹配上的内容,直至无可以匹配的内容...'exec2:', regex.exec(str)) console.log('exec3:', regex.exec(str)) // match1: ["aaa1", "aaa", "1", index...', regex.exec(str)) console.log('exec3:', regex.exec(str)) // match1: ["aaa1", "bbb2", "ccc3"] // match2

2.8K20
  • ES2018新特性学习

    不能匹配行终止符的行为: /hello.world/.test('hello\nworld') // false /hello.world/s.test('hello\nworld') // true...这种引用既可以正则表达式内部,也可以是在正则表达式外部。 捕获组有两种形式,一种是普通捕获组,另一种是命名捕获组。...zhen)/ const match1 = regex.exec('lizhen') console.log(match1) // null const match2 = regex.exec.../ const match = regex.exec('$123.89') console.log(match[0]) // 123.89 正则表达式 Unicode 转义 Unicode 标准为每个符号分配各种属性和属性值...解决方案 ES2018 中使用 \p{…} 和 \P{…} 进行 Unicode 的属性转义,在正则表达式中使用 u 进行标记。在 \p{…} 内,可以以键值对的方式设置需要匹配的属性,而非具体内容。

    64310

    《现代Javascript高级教程》正则表达式的常见问题与练习

    现代JavaScript高级小册 深入浅出Dar 现代TypeScript高级小 正则表达式的常见问题与练习 正则表达式是面试中经常被提及的主题之一,很多人在面试中对于正则表达式的问题常常感到困惑。...问题一:JavaScript 中的字符串与正则表达式操作 在 JavaScript 中,我们可以使用三个方法来操作字符串和正则表达式:test、exec 和 match。...示例: const regex = /(\d+)([a-z])/; const str = '123a'; let result; while ((result = regex.exec(str))...问题二:在正则表达式中匹配多个空格 有时候,我们希望匹配连续的多个空格,可以使用正则表达式中的特殊字符 \s。...问题四:在正则表达式中替换字符串 在 JavaScript 中,我们可以使用 String.prototype.replace() 方法来替换字符串中的内容。正则表达式可以用于指定要替换的模式。

    17340

    JS正则表达式完整版

    第4章,讲解了正则了正则表达式的回溯法原理。另外在第6章里,也讲解了正则的表达式的整体工作原理。 不仅能看懂别人的正则,还要自己会写正则。...2.2 排除字符组 纵向模糊匹配,还有一种情形就是,某位字符可以是任何东西,不能是”a”、”b”、”c”。 此时就是排除字符组(反义字符组)的概念。...一般书上,没有很好强调这四者是个位置。 比如(?=p),一般都理解成:要求接下来的字符与p匹配,但不能包括p的那些字符。 而在本人看来(?=p)就与^一样好理解,就是p前面的那个位置。 3....单词的界定是,前面的字符可以是多个连字符、下划线以及空白符。正则后面的?的目的,是为了应对str尾部的字符可能不是单词字符,比如str是’-moz-transform ‘。...第七章 正则表达式编程 什么叫知识,能指导我们实践的东西才叫知识。 学习一样东西,如果不能使用,最多只能算作纸上谈兵。正则表达式的学习,也不例外。

    3.1K40

    第六章 正则表达式的构建

    第六章 正则表达式的构建 对于一门语言的掌握程度怎么样,可以有两个角度来衡量:读和写。 不仅要看懂别人的解决方案,也要能独立地解决问题。代码是这样,正则表达式也是这样。...同时,也不能走入另一个极端:无所不用正则。能用字符串API解决的简单问题,就不该正则出马。...$/ 此正则看似没问题,这个正则也会匹配空字符""。 因为目标字符串的形式关系不是要求每部分都是可选的。 要匹配1.23、+1.23、-1.23,可以用 /^[+-]?\d+\....什么情形正则表达式运行才慢呢?我们需要考察正则表达式的运行过程(原理)。...而第二次,起始下标是3,第3个字符是“a”,并不是数字。此时并不会直接报匹配失败,而是移动到下一位置,即从第4位开始继续尝试匹配,该字符是b,也不是数字。

    65460

    正则的扩展

    如果RegExp构造函数第一个参数是一个正则对象,那么可以使用第二个参数指定修饰符。而且,返回的正则表达式会忽略原有的正则表达式的修饰符,只使用新指定的修饰符。...# 字符串的正则方法 字符串对象共有 4 个方法,可以使用正则表达式:match()、replace()、search()和split()。...对于码点大于0xFFFF的 Unicode 字符,点字符不能识别,必须加上u修饰符。 var s = ''; /^.$/.test(s) // false /^..../b/y.exec('aba') // null 上面代码由于不能保证头部匹配,所以返回null。y修饰符的设计本意,就是让头部匹配的标志^在全局匹配中都有效。...函数内部可以直接对这个对象进行解构赋值。 # 引用 如果要在正则表达式内部引用某个“具名组匹配”,可以使用\k的写法。 const RE_TWICE = /^(?[a-z]+)!

    97520

    js 怎么使用正则表达式-理解Javascript的正则表达式

    正则表达式是个非常有用的特性,不管是、PHP、Java还是Python都有正则表达式。俨然正则表达式已经发展成了一门小语言。作为编程语言的一部分,它不想变量,函数,对象这种概念那么容易理解。...var regex = /hello/; var str = 'hello world'; var result = regex.exec(str); console.log(result...= 'ABC'; console.log(reg1.test(str)); // true   正则表达式的思考   正则表达式是对字符串进行匹配的一种模式。   ...这里有一种更简单的实现方案js 怎么使用正则表达式,就是指定字符范围,比如[a-h]就是匹配字母a到字母h之间所有的字母,除了小写字母还可以匹配数字和大写字母,[0-9]匹配0到9之间的数字js 怎么使用正则表达式...\转义,同样相匹配\也可以用\转义,比如:    var regex = /[]/;   上面的特殊字符都只能匹配某个目标字符串一次,很多场景下我们需要匹配目标字符串多次,比如我们想匹配无数个

    3K30

    【译】ES10功能完全指南 - 还学的动吗?

    如果不出意外,你可能会学到新的有关正则表达式的东西。 正则表达式捕获组 在正则表达式中捕获组只是在 ()括号中提取匹配。...捕获组知识带有提取模式()的正则表达式的一部分。 它返回一个迭代器而不是数组,迭代器本身很有用。 可以使用扩展运算符...将迭代器转为数组。...它避免使用带 /g标志的正则表达式...当从数据库或外部源检索未知的正则表达式并与古老的RegEx对象一起使用时非常有用。 使用 RegExp对象创建的正则表达式不能使用点( .)运算符链接。...如前所述,由于上述许多原因,这是更好的方法。并且删除 / g不会导致无限循环。...但它们也是简单的例子,大部分时间都可以毫无障碍地工作! U + 2028和U + 2029字符 这是捕获。 ES10之前的 EcmaScript实际上并不完全支持 JSON格式。

    1.4K20

    使用 GPT 写代码:高亮页面关键字

    最近用户跟我反馈了一个问题,他们使用的浏览器高亮关键字的插件在我们的网站不生效,我看了一下,因为使用了 webComponent 插件没有进行兼容。...部分 var bodyContent = document.body.innerHTMl; // 获取页面内容 var pattern = new RegExp('关键字', 'g'); // 生成正则表达式...于是我决定问问 GPT,看看它能不能给我一点惊喜 使用 GPT 编写代码 我:我要写一段 js 代码,传入指定的文本,在整个页面高亮 GPT: 你可以使用 JavaScript 中的 DOM 操作来实现这个功能...---- 点评:改了,没完全改好,TreeWalker 中仍然有修改 DOM 的操作,于是我换了个说法 ---- 我:不能在遍历过程中调用 deleteContents 和 insertNode GPT...支持 shadowRoot 我:这样还不能遍历 webComponent shadowRoot 里面的元素 GPT: function highlightText(text) { const body

    33330

    使用 GPT 写代码:高亮页面关键字

    背景最近用户跟我反馈了一个问题,他们使用的浏览器高亮关键字的插件在我们的网站不生效,我看了一下,因为使用了 webComponent 插件没有进行兼容。...js部分var bodyContent = document.body.innerHTMl; // 获取页面内容var pattern = new RegExp('关键字', 'g'); // 生成正则表达式...于是我决定问问 GPT,看看它能不能给我一点惊喜使用 GPT 编写代码我:我要写一段 js 代码,传入指定的文本,在整个页面高亮GPT:你可以使用 JavaScript 中的 DOM 操作来实现这个功能...---点评:改了,没完全改好,TreeWalker 中仍然有修改 DOM 的操作,于是我换了个说法---我:不能在遍历过程中调用 deleteContents 和 insertNodeGPT:是的,你说的很对...支持 shadowRoot我:这样还不能遍历 webComponent shadowRoot 里面的元素GPT:function highlightText(text) { const body =

    1.9K20

    「建议收藏」送你一份精心总结的3万字ES6实用指南(下)

    所以,正则表达式还引入了一个dotAll属性,返回一个布尔值,表示该正则表达式是否处在dotAll模式: /foo.bar/s.dotAll // true 具名组匹配 正则表达式可以使用捕获组来匹配字符串.../g let iterable = str.matchAll(regexp) for (const x of iterable) { console.log(x) } // ['test1',...❞ 也可以将这个可迭代数据转成数组形式: // 方法一 [...str.matchAll(regexp)] // 方法二 Array.from(str.matchAll(regexp)) 动态import...另外由于动态性不便于静态分析工具和 tree-shaking 工作,所以不能滥用。 BigInt BigInt 是一种内置对象,它提供了一种方法来表示大于 - 1 的整数。...queryString.split('+').join(' ') 而现在只需要这么做: const withSpace3 = queryString.replaceAll('+', ' ') ❝replaceAll 的第一个参数可以是字符串也可以正则表达式

    1.7K10

    第三章 正则表达式括号的作用

    第三章 正则表达式括号的作用 不管哪门语言中都有括号。正则表达式也是一门语言,而括号的存在使这门语言更为强大。 对括号的使用是否得心应手,是衡量对正则的掌握水平的一个侧面标准。...regex.exec(string) ); // => ["2017-06-12", "2017", "06", "12", index: 0, input: "2017-06-12"] 同时,也可以使用构造函数的全局属性...regex = /(\d{4})-(\d{2})-(\d{2})/; var string = "2017-06-12"; regex.test(string); // 正则操作即可,例如 //regex.exec...反向引用 除了使用相应API来引用分组,也可以在正则本身里引用分组。只能引用之前出现的分组,即反向引用。 还是以日期为例。...单词的界定是,前面的字符可以是多个连字符、下划线以及空白符。正则后面的?的目的,是为了应对str尾部的字符可能不是单词字符,比如str是’-moz-transform ‘。

    1.6K60
    领券