JavaScript 正则如何提取

打开手机相册翻照片时,你会不会下意识找那几张带具体时间的截图?比如“2024-05-12 周末聚餐记录”,里面藏着你想找的信息。如果这些文字是存在一段字符串里的,比如一段聊天记录、一篇笔记的文本,怎么快速把里面的日期、手机号或者邮箱摘出来?这时候,JavaScript里的正则表达式就能帮上忙。

很多人觉得正则像一串乱码,其实它只是给电脑“划重点”的规则,就像你给朋友发的“帮我找这段文字里带横线的日期”的指令。咱们从最常用的场景入手,一步步拆解怎么用它提取信息,全是生活化的例子,不用记复杂术语。

JavaScript 正则如何提取

先搞懂核心:正则提取的两个关键步骤

不管要提取什么,都得先做两步:第一步告诉电脑“要找的内容是什么样的”,第二步告诉电脑“找到后要把它拿出来”。举个最常见的例子:你要从一段文字里提取所有11位的中国手机号,手机号的特征是“开头是1,第二位是3/4/5/6/7/8/9,后面跟9个数字”,把这个特征写成正则,再用JavaScript的方法把匹配到的内容拿出来就行。

第一个场景:提取固定格式的文本(比如日期)

先看一段很实用的文本:“今天是2024-06-15,昨天是2024-06-14,前天是2024-06-13,我们约了2024-07-01去旅行”。这里的日期都是“YYYY-MM-DD”的格式,要把所有日期摘出来,怎么写正则?

这个日期的特征很明确:4个数字+横线+2个数字+横线+2个数字,对应正则里的\d{4}-\d{2}-\d{2}。这里的\d代表“任意数字”,{4}代表“前面的内容要重复4次”,横线是固定要匹配的符号。

然后用JavaScript的match方法就能拿到结果:

`javascript

const text = "今天是2024-06-15,昨天是2024-06-14,前天是2024-06-13,我们约了2024-07-01去旅行";

const dateList = text.match(/\d{4}-\d{2}-\d{2}/g);

`

这里的g是全局匹配的意思,就是把所有符合的都找出来,不然只会返回第一个。运行后dateList就是["2024-06-15", "2024-06-14", "2024-06-13", "2024-07-01"],刚好是需要的所有日期。

第二个场景:提取位置灵活的信息(比如用户名)

如果信息的格式不固定,比如一段评论里的“@小明 你发的文件,@小红 麻烦帮我看看”,要把所有@后面的用户名摘出来,用户名的特征是“@开头,后面跟至少1个非空格的字符(因为用户名不会有空格)”,对应的正则是/@(\S+)/,这里的\S代表“非空格的任意字符”,括号是把要提取的内容单独分组。

用matchAll方法可以拿到所有分组的内容:

`javascript

const comment = "@小明 你发的文件,@小红 麻烦帮我看看";

const userList = Array.from(comment.matchAll(/@(\S+)/g), match => match[1]);

`

运行后userList就是["小明", "小红"],完美避开了@符号,只拿到了需要的用户名。

避坑提醒:别漏了全局匹配的标记

很多新手会犯一个错:写了正则,用match只拿到第一个结果,就以为正则写得不对,其实是忘了加g标记。比如刚才的日期例子,没加g的话,dateList只会是["2024-06-15"],白忙活一场。如果是要提取带分组的内容,用matchAll的时候,也要记得加g,不然只能拿到第一次的匹配结果。

其实JavaScript正则提取的本质,就是把生活里的“找XX样子的内容”转换成电脑能看懂的规则,再用内置方法把匹配到的内容取出来。平时不用硬背复杂的正则,遇到具体场景的时候,先想清楚要提取的内容有什么固定特征,再对应写出简单的规则就行。

上一篇 TypeScript Jest 怎么配置