x-note
  • Introduction
  • JavaScript
    • JavaScript 作用域链
    • JavaScript 数据结构与类型
    • JavaScript 原型
    • JavaScript this 关键字
    • JavaScript 函数
    • JavaScript delete 运算符
    • JavaScript 内存管理与垃圾回收
    • JavaScript 严格模式与混乱模式
    • JavaScript 数字精度丢失
    • JavaScript 并发模型
    • 利用原型链实现继承
  • ECMAScript
    • ECMAScript 6 变量及常量的声明
    • ECMAScript 6 变量的解构赋值
    • ECMAScript 6 Promise 对象
    • ECMAScript 6 Symbol
    • ECMAScript 6 Proxy
    • ECMAScript 6 Reflect
    • ECMAScript 6 new.target
    • ECMAScript 6 Set 和 WeakSet
    • ECMAScript 6 Map 和 WeakMap
    • ECMAScript 6 Iterator
    • ECMAScript 6 Generator
    • ECMAScript 6 class
    • ECMAScript 7
    • ECMAScript 8 async 函数
    • ECMAScript 8 内存共享与原子性
    • ECMAScript 8 Others
    • ECMAScript 2018
    • ECMAScript 2019
  • CSS
    • CSS 块格式化上下文(BFC)
    • CSS 盒模型
    • CSS 外边距合并
    • CSS Float
    • CSS Position
    • CSS Border-Image
    • CSS BEM
    • CSS 表布局详解
    • 页面布局之单列布局
    • 页面布局之多列布局
  • React
    • React 组件的生命周期
    • React 虚拟 DOM
    • React Reconciliation
    • React Diff 算法核心
    • React Fiber
    • React Scheduling
    • React Context API
    • React Refs
    • React HMR
    • React Hook
  • VUE
    • VUE 响应式系统
    • VUE 渲染机制
    • 关于 Vue 的思考
  • Webpack
    • Webpack 基本概念
    • Webpack HMR
  • Babel
    • @babel/preset-env
  • WEB
    • WEB 基础知识及概念
      • 屏幕测量单位
      • 重绘与重排
      • 前端模块化系统
      • WEB 客户端存储
      • 浏览器的渲染过程
    • WEB 性能优化
      • WEB 性能指标
      • WEB 图片优化
      • 懒加载资源
    • WEB 安全
      • XSS
      • XSRF
      • 点击劫持
      • 同源策略(Same Origin Policy,SOP)
    • WEB 解决方案
      • webp 兼容方案
      • WEB 拖拽实现方案
    • WEB SEO
  • Git
    • Git 工作流
    • Git 内部原理
  • 传输协议
    • UDP
      • UDP 基本概念
    • TCP
      • TCP 基本概念
    • HTTP
      • HTTP 基础
      • HTTP 缓存
      • HTTP-2
      • HTTP-3
      • HTTPS
      • 自定义 HTTPS 证书
  • Protocol Buffers
    • Protocol Buffers 基础
  • gRPC
    • gRPC 简介
    • gRPC 基础概念
    • GRPC with GraphQL and TypeScript
  • 正则表达式
    • 正则表达式基础
    • 正则表达式的悲观回溯
  • 基础算法
    • 冒泡排序
    • 插入排序
    • 选择排序
    • 快速排序
    • 归并排序
    • 希尔排序
    • 堆排序
    • 桶排序
    • 计数排序
    • 基数排序
    • 二叉树的遍历
    • 动态规划
    • 回溯
  • 压缩算法
    • HPACK
    • QPACK
  • 设计模式
    • DDD
      • 模型元素的模式
    • 常见设计模式
      • 工厂方法
      • 抽象工厂
      • 构造器
      • 原型
      • 单例模式
      • 适配器模式
      • 桥接模式
      • 组合模式
      • 外观模式
      • 享元模式
      • 代理模式
      • 责任链模式
      • 命令模式
      • 迭代器模式
      • 中介者模式
      • 备忘录模式
      • 观察者模式
      • 状态模式
      • 策略模式
      • 模版方法模式
      • 访问者模式
      • 依赖注入
    • MVC
    • MVP
    • MVVM
  • 颜色空间
    • LCH
由 GitBook 提供支持
在本页
  • 元字符
  • 处理选项
  • 参考
在GitHub上编辑
  1. 正则表达式

正则表达式基础

正则表达式是由普通字符(例如字符 a 到 z)以及**特殊字符(称为"元字符")**组成的文字模式。

元字符

表达式中具有特殊含义的字符

常用元字符:

符号
含义

.

匹配除换行符以外的任意字符

\w

匹配字母或数字或下划线或汉字

\s

匹配任意的空白符

\d

匹配数字

\b

匹配单词的开始或结束

^

匹配字符串开始

$

匹配字符串的结束

字符转义

符号
含义

\

转义特殊字符

重复

符号
含义

*

重复零次或更多次

+

重复一次或更多次

?

重复零次或一次

{n}

重复 n 次

{n,}

重复 n 次或更多次

{n,m}

重复 n 次到 m 次

字符类

符号
含义

[str]

匹配限定字符

const reg = /^[a-zA-Z0-9]$/;
reg.test("b"); // true
reg.test("B"); // true
reg.test("2"); // true
reg.test("!"); // false

分支条件

使用分支条件时,要注意各个条件的顺序

符号
含义

`

将不同规则分割开,满足任意一种都能成功

const reg = /(^a)|(b$)/; // a 开头或 b 结尾
reg.test("asdfghjkl;zxcv"); // true
reg.test("sdfghjkl;zxcvb"); // true
reg.test("sdfghjkl;zxcv"); // false

分组

用小括号来指定子表达式(也叫做分组),然后就可以指定这个子表达式重复的次数。每个分组都会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组组号为1,第二个为2,一次类推。分组0对应整个表达式。

实际上,组号分配的过程要从左向右扫描两边:第一遍只给未命名组分配组号。第二遍只给命名组分配。因此所有命名组的组号都大于未命名的组号

符号
含义

(exp)

匹配表达式 exp,并捕获文本到自动命名的组

(?<name>exp)或(?'name'exp)

匹配表达式 exp,并捕获文本到名称为 name 的组里

(?:exp)

匹配表达式 exp,不捕获匹配的文本,也不给此组分配组号

反义

符号
含义

\W

匹配任意不是字母,数字,下划线,汉字的字符

\S

匹配任意不是空白符的字符

\D

匹配任意非数字的字符

\B

匹配任意非数字的字符

[^str]

匹配除了 str 以外的任意字符

const reg = /^[^a-zA-Z0-9]$/;
reg.test("b"); // false
reg.test("B"); // false
reg.test("2"); // false
reg.test("!"); // true

后向引用

后向引用用于重复搜索前面某个分组匹配的文本。

符号
含义

\(组名)

匹配某个分组匹配的文本

const reg = /^(\d)\1$/; // `\1` 代表分组 1 匹配的文本
reg.test("11"); // true
reg.test("12"); // false

贪婪与懒惰

当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。以/a.*b/为例,它将匹配最长的以 a 开始,以 b 结束的字符串。如果用它来匹配 aabab 的话,它会匹配整个字符串 aabab。这就是贪婪匹配。

符号
含义

*?

重复任意次,尽可能少的重复

+?

重复 1 次或更多次,尽可能少的重复

??

重复 0 次或 1 次,尽可能少的重复

{n,}?

重复 n 次以上,尽可能少的重复

{n,m}?

重复 n 到 m 次,尽可能少的重复

零宽断言

用于查找在某些内容(但不包括这些内容)之前或之后的东西,也就是说它们像\b ,^ ,$那样用于指定某个位置,这个位置应该满足一定条件(断言),即为零宽断言。

符号
含义

(?=exp)

匹配表达式 exp 前面的位置

(?<=exp)

匹配表达式 exp 后面的位置

(?!exp)

匹配后面跟的不是表达式 exp 的位置

(?<!exp)

匹配前面跟的不是表达式 exp 的位置

function isExampleSiteDomain(url) {
  const regexp = /^https{0,1}\:\/\/(\w+?\.)*?example\.com(?!\.|\w)/;
  return regexp.test(url);
}

const testCases = [
  "https://example.com",
  "http://example.com?redirect=https://baidu.com",
  "http://www.cn.example.com",
  "https://example.com/asd?a=1",
  "https://example.com/?a=1",
  "http://www.cn.example.com#hash",
  "https://example.qq.com/asd",
  "https://qq.com?redirect=https://example.com.cn?a=1",
  "http://example.com.qq.com",
  "http://qq.com/?url=example.com",
  "http://qqexample.com",
  "http://www.cn.example.com1",
];

testCases.forEach((_case) => {
  console.log(isASiteDomain(_case));
});
// true * 5
// false * 6

注释

符号
含义

(?#comment)

注释

平衡组/递归匹配

符号
含义

(?'group')

把捕获的内容命名为 group,并压入堆栈

(?'-group')

从堆栈上弹出最后压入堆栈的名为 group 的捕获内容,如果堆栈本来为空,则本次分组的匹配失败

`(?(group)yes

no)`

(?!)

零宽负向先行断言,由于没有后缀表达式,试图匹配总是失败

** 其他**

符号
含义

\a

报警字符(打印它的效果是电脑“嘀”一声)

\b

通常是单词分界位置

制表符

回车

\v

竖向制表符

\f

换页符

换行符

\e

Escape

\0nn

ASCLL 代码为 nn 的字符

\xnn

ASCLL 代码中十六进制代码为 nn 的字符

\unnnn

Unicode 代码中十六进制代码为 nnnn 的代码

\cN

ASCLL 控制字符。比如 \cC 代表 Ctrl+C

\A

字符串开头,类似^,但不受处理多行选项的影响

\Z

字符串结尾或行尾,不受多行选项的影响

\z

字符串结尾(类似$,但不受处理多行选项的影响)

\G

当前搜索的开头

\p{name}

Unicode 中命名为 name 的字符串类,例如 \p{IsGreek}

(?>exp)

贪婪子表达式

(?<x>-<y>exp)

平衡组

(?im-nsx:exp)

在子表达式后面的部分改变处理选项

(?im-nsx)

为表达式后面的部分改变处理选项

`(?(exp)yes

no)`

(?(exp)yes)

同上,只是使用空表达式作为 no

`(?(name)yes

no)`

(?(name)yes)

同上,只是使用空表达式作为 no

处理选项

各个语言提供的处理选项有细微的出入

  • IgnoreCase —— 忽略大小写

  • Multiline —— 多行模式。更改^和$的含义,使它们分别在任意一行的行首和行尾匹配,而不仅仅在整个字符串的开头和结尾匹配。(在此模式下,$的精确含义是:匹配之前的位置以及字符串结束前的位置)

  • Singleline —— 单行模式。更改.的含义,使它与每一个字符匹配。(包括换行符)

  • IgnorePatternWhitespace —— 忽略表达式中的非转义空白并启用由#标记的注释

  • ExplicitCapture —— 仅捕获已被显示命名的组

JavaScript RegExp 对象中提供的处理选项

  • g —— 全局匹配

  • i —— 忽略大小写

  • m —— 多行模式

  • u —— 将模式视为 Unicode 序列点点序列

  • y —— 粘性匹配;仅匹配目标字符串中此正则表达式的 lastIndex 属性指示的索引,并且不尝试从任何后续的索引匹配。

const reg = /^a$/i;
reg.test("a"); // true
reg.test("A"); // true

参考

上一页正则表达式下一页正则表达式的悲观回溯

最后更新于5年前

正则表达式 30 分钟入门教程