# JS 正则表达式基础

# 前言

个人经验,正则是一个前期少量投入,回报超高的技能点。

其适用范围非常广泛,如批量文本处理、源码替换、程序中逻辑判断等等。
本文只介绍常用的基础知识、技巧,让初学者快速掌握大部分日常所需的正则知识。目标是 5 分钟内可逐字读完,10 分钟内可把例子都动手实践一遍。

TIP

可以复制代码粘贴到控制台(F12 或 ctrl+shift+i)查看执行结果

# 特殊匹配符号

符号 介绍 示例
. 匹配任意字符 /./.test('a')
\w 匹配一个单字字符(字母、数字或者下划线) /\w/.test('a')
\d 匹配一个数字 /\d/.test('0')
\s 匹配一个空白符(空格、\n、\r 等等) /\s/.test(' ')

以上特殊字符大写,则含义相反,如\D匹配一个非数字

# 匹配数量控制

符号 介绍 示例
x? 匹配 0 或 1 个 x /https?:/.test('http://xxx'),http、https 均可
x+ 匹配 1 个或多个 x /\d+/.test('111'),匹配多个数字
x* 匹配任意多个 x,可以是 0 个 /\s*value\s*/.test('value '),允许 value 前后出现任意个空白符
x{3} 匹配 3 个 x /x{3}/.test('xxx')

这里特别介绍一下贪婪、非贪婪匹配,因为太常用了。
正则默认是贪婪匹配,即尽量匹配更多的字符;若在符号+*,后面紧跟?,则非贪婪模式。

// 默认贪婪模式,尽量匹配最多字符
/a.*c/.exec('abcabc') // ['abcabc']
// 非贪婪模式,尽量匹配最少字符
/a.*?c/.exec('abcabc') // ['abc']

# 字符集合

假设正则没有预设\d,我们要匹配所有数字应该怎么办?

可以这样写:
/0|1|2|3|4|5|6|7|8|9/.test('0')|表示'或' 的意思。

看起来太复杂了,简化一下:
/[0123456789]/.test('0')[]表示一个字符集合,只要匹配集合中的任意字符都能通过检测。

既然有了期望的字符集合(白名单),那也应该有非期望的集合(黑名单):
/[^0123456789]/(等价于\D)匹配所有非数字,方括号中^开头表示匹配 后面的这些字符。

# 分组

圆括号(.*)包围的内容表示正则的一个分组,分组可以搭配前面介绍的数量控制符号。
如简单的域名匹配:/(\w+\.)+(com|io)/.test('fenghen.me')

# 特殊非匹配符号

符号 介绍 示例
\ 转义符 /\+/.test('+')+是表数量的特殊字符,如果想匹配+本身,需在前加转义符\
^ 字符串起始位置 /^1/.test('1000') 匹配 1 开头的字符串
$ 字符串结束位置 /\.com$/.test('bilibili.com'),匹配 .com 结尾的字符串

# 应用技巧

使用正则的主要场景:

  1. 判断一个字符串是否具备某种特征
// 匹配国内手机号码
/^1[357]\d{9}$/.test('13881958429');
  1. 从一个字符串中提取特定子串
// 从字符串中 提取二级域名,匹配失败则给 company 赋 空串
// 匹配二级域名的是第二个分组(第二个圆括号),对应数组的第三个元素,详情查看 exec 的文档
const [, , company] = /(\w+\.)*(\w+?)\.com/.exec('bilibili.com') ?? [, , ''];
// company => bilibili
  1. 将特定字符串替换成其他字符串
// 删除字符串前后空格,等价于 trim 函数的效果
'   value   '.replace(/^\s*|\s*$/g, '');

// 这里有个前面未介绍的知识点
// /g 表示全局替换,去掉的话,替换起始部分的空格后就结束了(建议动手试试效果

当然,利用正则处理文本不局限于代码,配合编辑器往往也能节省大量时间。
如下图,使用 vscode+正则 可从大量的日志中提取出 error 日志(删除其他类型的日志)

# 结语

本文定位为初学者快速入门,所以只介绍常用的基础知识;
正则还有很多有意思的玩法,感兴趣的同学自行探索;
若你认为有高频使用的知识点没有介绍到,可在评论区回复。

# 附录

💗 博主正处于裸辞待业状态,欢迎 商务合作 💗

相关文章

从 React 看前端 UI 代码范式革命

alt text 前言 本来打算写的主题是“我为什么讨厌 React Hooks API”,展开聊聊“小甜甜”是如何变成“牛夫人”的,没想到越写越严肃:) React 是两次前端范式革命的引领者,至今仍有繁荣的社区和旺盛的创造力; React 多次天才又激进的创新,一些想法被借鉴改良、一些引发广泛质疑,大部分是被认同和接受的; ...

一句话总结:TS 何时选择 interface 或 type

用 interface 描述类型的结构,用 type 描述类型关系。 有点编程基础中数据结构与算法的味道。 结构即是类型的属性集合 // 如 Point3D 的属性集合: x, y, z。 interface Poi ...

JS 定时器时长控制细节

背景 JS 最常使用 setTimeout、setInterval 来延迟或定时循环执行函数,通常会传递第二个参数来控制延迟或间隔执行的时间。 但开发者必须意识到函数执行时间并非精确地符合预期,在以下场景中它会超出你的预期 CPU 繁忙(主线程被长时间占用),JS 无法按开发者设定的预期时间延迟函数 定时器过于频繁地执行(第二个参数 < 4),达到一定 ...

JS 多线程并发

[[toc]] 为什么需要并发 我们常听说 JS 是单线程模型,即所有代码都在主线程中执行的。 如果某些任务计算量较大,将阻塞主线程,UI 界面轻则掉帧、重则卡死。 // 提示:本文所有代理均可复制到浏览器控制台中执行,验证效果 // ...

系统化学习 TS 类型系统

目的:快速、系统性的入门 TS 类型系统 [[toc]] 前言 TS 是什么? TS 是 JS 的超集, TS = JS + 类型系统 为了描述如此复杂(由于 JS 语言的灵活性/复杂性)的类型信息,类型系统表现出非常明显的编程语言特性。 以学习编程语言的方式,来学习 TS 类型系统 关键字/符号 类型: boolean, number, stri ...

跨域(Options)请求介绍及解决方法

介绍 OPTIONS请求指method为OPTIONS的http请求。 通俗来说:它的作用是用于WEB服务器是否支持某些 header,也可以叫做预检请求(顾名思义:预先检测)。 程序员:跨域发送 http get { headers { xxx: abc } } 浏览器:等等,你这个请求有点奇怪,我去跟服务器确认下 浏览器:发送 http options ...

单测(Unit Test)技巧

前言 本文目的是提高编写单测的效率,适合于有一定单测编写经验,但被单测困扰的同学。 后文的示例都在 unit-test-examples 仓库中。 单测的意义与价值 单测本质:将测试行为及结果固化下来,自动检查被测试代码的运行结果是否符合期望。 单测是一 ...

compilerOptions字段详解

{ "compilerOptions": { /* 基本选项 */ "target": "es5", // 指定 ECMAScript 目标版本: 'ES3' (default), 'ES5', 'ES6'/'ES2015', 'ES2016', 'ES2017', or 'ESNEXT' "module": ...

JS优缺点

回顾上两期 优点(简单) 对象 链(原型链 & 作用域链) 一切都是对象(包括函数),构建世界的原料,越少越简单、灵活。 jimu 观察者模式,例: class Observer { constructor() { this.subscribe ...

JS 数据处理

[[toc]] 分享目标 JS 数据处理技巧速成 让你感叹:JS 还可以这样写 基础 实践原则 数据处理时,尽量避免创建临时变量(特别是 let)、修改参数、改变外部引用、for、if 等 分离 数据处理 与 副作用(DOM 操作、存储、网络请求等)代码 数据处理指:数值计算和数据结构变换。 第一点:如何避免? **1. 熟 ...