百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

鸿蒙开发:正则中的match和matchAll

csdh11 2025-03-25 12:16 10 浏览

前言


本文基于Api13


关于正则表达式,其实之前也撰写过相关文章,但没有对match和matchAll做过详细的分析,虽然都是用于常见的字符串匹配,但是在使用方式上还是具有一定的区别;大家记住一点,正则表达式适用于所有的编程语言,可能有些语法和使用方式有些不同,但基本的原理是一样的。


我们先看下源码:


match:将字符串与正则表达式匹配,并返回一个包含该搜索结果的数组。


 /**
     * Matches a string with a regular expression, and returns an array containing the results of that search.
     * @param regexp A variable name or string literal containing the regular expression pattern and flags.
     */
    match(regexp: string | RegExp): RegExpMatchArray | null;

matchAll:将字符串与正则表达式匹配,并返回匹配项的可迭代对象

获取搜索结果。

 /**
     * Matches a string with a regular expression, and returns an iterable of matches
     * containing the results of that search.
     * @param regexp A variable name or string literal containing the regular expression pattern and flags.
     */
    matchAll(regexp: RegExp): IterableIterator;

我们从源码中也能看到,两者的参数和返回值也是有着一定的区别,在开发中,如果是一个字符串,可以直接调用到这两个方法。

相关介绍

match方法


首先,match呢,它是字符串对象的一个方法,用于在字符串中查找与正则表达式匹配的内容,可以接收两个类型的参数,一个是string,另一个是RegExp对象。

其中,string是要进行匹配的字符串,RegExp是一个正则表达式对象或字符串,有一点需要注意,如果RegExp不是正则表达式对象,则会隐式地将其转换为正则表达式对象。


match方法的返回值取决于正则表达式是否包含全局匹配标志g,这个还是蛮重要的,首先,如果正则表达式包含g标志,那么match方法将返回一个包含所有匹配结果的数组;如果不包含g标志,match方法将返回一个数组,数组的第一个元素是匹配的字符串,后续元素是捕获组的内容。如果没有匹配到任何内容,则返回null。

matchAll方法

matchAll方法是用于在字符串中查找所有与正则表达式匹配的内容,并返回一个迭代器,只接收RegExp对象,和match方法不同的是,必须包含全局匹配标志g,否则就会报错。


matchAll方法返回一个迭代器,每个迭代项都是一个包含匹配结果的数组。每个数组的第一个元素是匹配的字符串,后续元素是捕获组的内容。如果没有匹配到任何内容,则返回一个空的迭代器。

主要区别

格式要求

这个,上述已经说过了,也就是标志g,match方法对正则表达式没有特殊要求,可以包含或不包含g标志;matchAll方法要求正则表达式必须包含g标志,否则会就会报错。

返回值

match方法的返回值是一个RegExpMatchArray数组或null。如果正则表达式包含g标志,返回的数组包含所有匹配的字符串;如果不包含g标志,返回的数组包含匹配的字符串和捕获组的内容;而matchAll方法的返回值是一个迭代器,每个迭代项都是一个包含匹配结果的数组。每个数组包含匹配的字符串和捕获组的内容。

使用场景

match方法适用于简单的匹配操作,尤其是当只需要匹配第一个结果或不需要全局匹配时,而matchAll方法适用于需要获取所有匹配结果及其捕获组的场景,尤其是在处理复杂的正则表达式时。

使用方式

match方法


有一个简单的字符串,需要从中提取所有的数字,我们简单实现一下:


const content = "程序员一鸣88是一个非常优秀的66程序员"
const regex = /\d+/g
const result = content.match(regex)
console.log( JSON.stringify(result))


在这个例子中,我们使用match方法提取了字符串中的所有数字。由于正则表达式包含g标志,match方法返回了一个包含所有匹配结果的数组。

输出结果:


["88","66"]


matchAll方法


有一个字符串,需要从中提取所有的日期及其组成部包含年、月、日,我们就可以如下操作:

const str = "今天是 2025-03-23,明天是 2025-03-24, 后天是 2025-03-25"
const regex = /(\d{4})-(\d{2})-(\d{2})/g
const result = Array.from(str.matchAll(regex))
result.forEach(match => {
  console.log("===结果: "+match[0]+", 年: "+match[1]+", 月: "+match[2]+", 日: "+match[3]+"");
})


在这个例子中,我们使用matchAll方法提取了字符串中的所有日期及其组成部分。由于正则表达式包含g标志,matchAll方法返回了一个迭代器,我们将其转换为数组后,可以方便地访问每个匹配结果及其捕获组。

match和matchAll做下比较


有一个字符串,需要从中提取所有的电子邮件地址及其用户名和域名:


const str = "简单列举几个邮箱地址,111@qq.com or aaaaa@163.com"
const regex = /(\w+)@(\w+\.\w+)/g

// 使用match方法
const matchResult = str.match(regex)
console.log("===" + JSON.stringify(matchResult))

// 使用matchAll方法
const matchAllResult = Array.from(str.matchAll(regex))
matchAllResult.forEach(match => {
  console.log("===结果: " + match[0] + ", @前: " + match[1] + ", @后: " + match[2] + "")
});


我们看下结果:



在这个例子中,match方法只能返回匹配的电子邮件地址,而matchAll方法可以返回每个电子邮件地址及其用户名和域名。因此,matchAll方法在处理需要捕获组的场景时更为强大。

相关总结

在实际的开发中,match和matchAll是两个非常常见的的正则表达式方法;match方法适用于简单的匹配操作,而matchAll方法则适用于需要获取所有匹配结果及其捕获组的场景。

相关推荐

NUS邵林团队发布DexSinGrasp基于强化学习实现物体分离与抓取统一

本文的作者均来自新加坡国立大学LinSLab。本文的共同第一作者为新加坡国立大学实习生许立昕和博士生刘子轩,主要研究方向为机器人学习和灵巧操纵,其余作者分别为硕士生桂哲玮、实习生郭京翔、江泽宇以及...

「PLC进阶」如何通过编写SCL语言程序实现物料分拣?

01、前言SCL作为IEC61131-3编程语言的一种,由于其高级语言的特性,特别适合复杂运算、复杂数学函数应用的场合。本文以FactoryIO软件中的物料分拣案例作为硬件基础,介绍如何通过SCL来实...

zk源码—5.请求的处理过程一(http1.1请求方法)

大纲1.服务器的请求处理链...

自己动手从0开始实现一个分布式 RPC 框架

前言为什么要自己写一个RPC框架,我觉得从个人成长上说,如果一个程序员能清楚的了解RPC框架所具备的要素,掌握RPC框架中涉及的服务注册发现、负载均衡、序列化协议、RPC通信协议、Socket通信、异...

MLSys’25 | 极低内存消耗:用SGD的内存成本实现AdamW的优化性能

AIxiv专栏是机器之心发布学术、技术内容的栏目。过去数年,机器之心AIxiv专栏接收报道了2000多篇内容,覆盖全球各大高校与企业的顶级实验室,有效促进了学术交流与传播。如果您有优秀的工作想要分享,...

线程池误用导致系统假死(线程池会自动销毁吗)

背景介绍在项目中,为了提高系统性能使用了RxJava实现异步方案,其中异步线程池是自建的。但是当QPS稍微增大之后却发现系统假死、无响应和返回,调用方出现大量超时现象。但是通过监控发现,系统线程数正常...

大型乘用车工厂布局规划(六大乘用车基地)

乘用车工厂的布局规划直接影响生产效率、物流成本、安全性和未来扩展能力。合理的布局应确保生产流程顺畅、物流高效、资源优化,并符合现代化智能制造和绿色工厂的要求。以下是详细的工厂布局规划要点:1.工厂布...

西门子 S7-200 SMART PLC 连接Factory IO的方法

有很多同学不清楚如何西门子200smart如何连接FactoryIO,本教程为您提供了如何使用西门子S7-200SMARTPLC连接FactoryIO的说明。设置PC和PLC之间的...

西门子博图高级仿真软件的应用(西门子博途软件仿真)

1.博图高级仿真软件(S7-PLCSIMAdvancedV2.0)S7-PLCSIMAdvancedV2.0包含大量仿真功能,通过创建虚拟控制器对S7-1500和ET200SP控制器进行仿真...

PLC编程必踩的6大坑——请对号入座,评论区见

一、缺乏整体规划:面条式代码问题实例:某快递分拣线项目初期未做流程图设计,工程师直接开始编写传送带控制程序。后期增加质检模块时发现I/O地址冲突,电机启停逻辑与传感器信号出现3处死循环,导致项目延期2...

统信UOS无需开发者模式安装软件包
统信UOS无需开发者模式安装软件包

原文链接:统信UOS无需开发者模式安装软件包...

2025-05-05 14:55 csdh11

100个Java工具类之76:数据指纹DigestUtils

为了提高数据安全性,保证数据的完整性和真实性,DigestUtils应运而生。正确恰当地使用DigestUtils的加密算法,可以实现数据的脱敏,防止数据泄露或篡改。...

麒麟KYLINIOS软件仓库搭建02-软件仓库添加新的软件包

#秋日生活打卡季#原文链接:...

Java常用工具类技术文档(java中工具类的作用)

一、概述Java工具类(UtilityClasses)是封装了通用功能的静态方法集合,能够简化代码、提高开发效率。本文整理Java原生及常用第三方库(如ApacheCommons、GoogleG...

软路由的用法(自动追剧配置)(软路由教学)

本内容来源于@什么值得买APP,观点仅代表作者本人|作者:值友98958248861环境和需求...