> For the complete documentation index, see [llms.txt](https://learn.js.cool/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://learn.js.cool/regexp/base.md).

# 正则基础

推荐的在线学习、编写、测试集成工具： <https://regexr.com/>

## 字符类

### `[]` 匹配

`[aeiou]` 示例：

```javascript
'glib jocks vex dwarves!'.match(/[aeiou]/g)
// =>
// ["i", "o", "e", "a", "e"]
```

匹配结果： gl**i**b j**o**cks v**e**x dw**a**rv**e**s!

### `^` 非

`[^aeiou]` 示例：

```javascript
'glib jocks vex dwarves!'.match(/[^aeiou]/g)
// =>
// ["g", "l", "b", " ", "j", "c", "k", "s", " ", "v", "x", " ", "d", "w", "r", "v", "s", "!"]
```

匹配结果正好与上一个示例中的互补

### `-` 范围

示例： `[a-z]` 表示从 a 到 z 范围内的所有小写字母

### `.` 任意字符

注意，`.` 表示所有字符（字母、数字、符号），除了：`换行`

### `\w` 词语（word缩写）

等同于： `[A-Za-z0-9_]`

### `\W` 非词语

等同于： `[^A-Za-z0-9_]`

### `\d` 数字

等同于： `[0-9]`

### `\D` 非数字

等同于： `[^0-9]`

### `\s` 空白符

包括：空格、制表符（Tab）、换行

### `\S` 非空白符

与空白符互补

## 锚点

### `^` 起始

示例： `/^\d/` 表示以数字开头

### `$` 结束

示例： `/\d$/` 表示以数字结尾

### `\b` 单词边界

示例：

```javascript
'she sells seashells'.match(/e\b/g)
// =>
// ["e"]
// 来自于 sh[e空格]sells
```

### `\B` 非单词边界

与 `\b` 互补

## 转义字符

### `\` 保留字

示例： `\\` 以字符串匹配 `\`

### `\t` Tab

### `\n` 换行

### 其他

非常见的转译字符：

* `\v` 垂直Tab
* `\f`
* `\r` 回车
* `\0` Null
* `\cI`
* `\000` 八进制
* `\xFF` 十六进制
* `\uFFFF` Unicode
* `\u{FFFF}` 扩展Unicode

## 组合

### `()` 捕获分组

示例： `/(ha)+/` 匹配重复的 `ha`

### `\1` 数组引用

示例： `/(\w)a\1/` 匹配以a为中间字母的三字叠字词如 `dad`, `hah`

### `(?:)` 非捕获分组

依然以分组进行匹配，但不会创建捕获分组。

## 观望

### `(?=)` 向后匹配

示例：

```javascript
'1pt 2px 3em 4px'.match(/\d(?=px)/g)
// =>
// ["2", "4"]
// 单位为 px 的两个结果
```

### `(?!)` 向后反匹配

示例：

```javascript
'1pt 2px 3em 4px'.match(/\d(?!px)/g)
// =>
// ["1", "3"]
// 单位不为 px 的两个结果
```

## 数量及替换

### `+` 至少出现一次

示例： `\d+`

### `*` 出现0次或多次

### `{n,m}` 出现n到m次

示例：

* `\d{3}` 指定 3 位数字
* `\d{1,3}` 可以是 1 - 3 位数字
* `\d{3,}` 可以是 3位或更多位数字

### `?` 至多出现一次（0 或 1）

示例： `/colou?r/` 匹配 color 和 colour

### `?` 懒匹配

正常情况下，数量匹配是贪婪匹配，尽可能匹配更多。

示例： `/b\w+?/` 表示尽可能少的匹配，如`beers`匹配结果为`be`。

### `|` 或

示例： `b(a|e|i)d`

## 子语句

* `$&` 匹配
* `$1` 捕获分组
* `` $` `` 前匹配
* `$'` 后匹配
* `$$` 转义`$`符号
* `\n` 转义字符

## 标识

* `i` 忽略大小写
* `g` 全局搜索
* `m` 多行
* `u` Unicode
* `y` 从上次位置继续并忽略 `g` 全局搜索
