Files
sanbuphy 6098908eee feat(docs): add interactive demos and complete content for development tools
- Add Vue components for interactive demos (SSH auth, regex, env vars, ports)
- Complete markdown content for SSH, regex, environment variables, and ports
- Remove placeholder "待实现" sections and replace with detailed guides
- Add visual explanations for key concepts like ports and localhost
- Include practical examples and troubleshooting tips
- Add component for showing evolution from transistors to CPU
- Improve documentation structure and navigation
- Add security best practices for API keys and environment variables
2026-02-21 10:04:47 +08:00

179 lines
4.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 正则表达式
> 💡 **学习指南**:正则表达式看起来像天书?其实它只是一种"描述文本模式"的迷你语言。本章带你从零开始理解正则的核心思想,学会用几个关键符号解决 80% 的文本搜索和验证问题。
---
## 0. 你为什么需要正则表达式?
想象以下场景:
- 从一大段日志里找出所有 IP 地址
- 验证用户输入的邮箱格式是否合法
- 把文本中所有的日期格式从 `2024/01/15` 替换为 `2024-01-15`
- 从网页源码中提取所有链接
**用普通字符串搜索?** 你需要写一大堆 `if-else` 判断逻辑。
**用正则表达式?** 一行模式搞定。
---
## 1. 正则入门:三分钟上手
👇 动手点点看:输入正则表达式,实时查看匹配结果
<RegexDemo />
::: tip 💡 一句话理解
正则表达式 = **用特殊符号描述"你想找什么样的文本"**`\d` 代表数字,`+` 代表一个或多个,所以 `\d+` 就是"一个或多个数字"。
:::
---
## 2. 核心概念:像搭积木一样组合
正则的本质是用**三类积木**搭出你想要的模式:
### 2.1 积木一:字符类(匹配什么字符)
| 语法 | 含义 | 示例 |
|---|---|---|
| `.` | 任意字符 | `a.c` → abc, a1c, a c |
| `\d` | 数字 [0-9] | `\d\d` → 42, 99 |
| `\w` | 字母/数字/下划线 | `\w+` → hello, user_1 |
| `\s` | 空白字符 | 匹配空格、Tab |
| `[abc]` | 集合中的任意一个 | `[aeiou]` → 元音字母 |
| `[^abc]` | 不在集合中的 | `[^0-9]` → 非数字字符 |
### 2.2 积木二:量词(匹配几次)
| 语法 | 含义 | 示例 |
|---|---|---|
| `*` | 0 次或多次 | `ab*` → a, ab, abbb |
| `+` | 1 次或多次 | `ab+` → ab, abbb(不匹配 a |
| `?` | 0 次或 1 次 | `colou?r` → color, colour |
| `{3}` | 恰好 3 次 | `\d{3}` → 123 |
| `{2,4}` | 2 到 4 次 | `\d{2,4}` → 12, 1234 |
### 2.3 积木三:位置和分组
| 语法 | 含义 | 示例 |
|---|---|---|
| `^` | 行首 | `^Hello` → 以 Hello 开头的行 |
| `$` | 行尾 | `end$` → 以 end 结尾的行 |
| `\b` | 单词边界 | `\bcat\b` → cat(不匹配 catch |
| `(...)` | 捕获分组 | `(\d+)-(\d+)` → 分别捕获 |
| `a\|b` | 或 | `cat\|dog` → cat 或 dog |
---
## 3. 实战:常见验证模式
### 3.1 邮箱验证
```
[\w.+-]+@[\w-]+\.[\w.]+
```
拆解:
- `[\w.+-]+` — 用户名部分(字母数字点加号横杠)
- `@` — 字面量 @
- `[\w-]+` — 域名部分
- `\.` — 转义的点
- `[\w.]+` — 顶级域名
### 3.2 手机号验证(中国)
```
1[3-9]\d{9}
```
拆解:
- `1` — 以 1 开头
- `[3-9]` — 第二位是 3-9
- `\d{9}` — 后面跟 9 位数字
### 3.3 密码强度检查
```
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$
```
拆解:
- `(?=.*[a-z])` — 至少一个小写字母(前瞻断言)
- `(?=.*[A-Z])` — 至少一个大写字母
- `(?=.*\d)` — 至少一个数字
- `.{8,}` — 总长度至少 8 位
---
## 4. 在代码中使用正则
### JavaScript
```javascript
const text = '联系方式:13812345678 或 15099887766'
const regex = /1[3-9]\d{9}/g
const phones = text.match(regex)
// ['13812345678', '15099887766']
// 替换
text.replace(/\d{4}(?=\d{4}$)/, '****')
// 隐藏手机号中间四位
// 验证
/^[\w.+-]+@[\w-]+\.[\w.]+$/.test('user@example.com')
// true
```
### Python
```python
import re
text = '价格是 99 元,优惠 20 元'
numbers = re.findall(r'\d+', text)
# ['99', '20']
# 替换
re.sub(r'\d+', 'X', text)
# '价格是 X 元,优惠 X 元'
# 分组捕获
match = re.search(r'(\d+)-(\d+)', '2024-01-15')
match.group(1) # '2024'
match.group(2) # '01'
```
---
## 5. 贪婪 vs 懒惰:一个关键区别
```
文本: <b>hello</b> and <b>world</b>
```
| 模式 | 匹配结果 | 说明 |
|---|---|---|
| `<b>.*</b>` | `<b>hello</b> and <b>world</b>` | 贪婪:尽量多匹配 |
| `<b>.*?</b>` | `<b>hello</b>` | 懒惰:尽量少匹配 |
::: tip 💡 记住
默认是贪婪模式。在量词后面加 `?` 变成懒惰模式。大多数时候,你需要的是懒惰模式。
:::
---
## 6. 总结
::: tip 📚 核心要点
1. **正则 = 描述文本模式的迷你语言**,用于搜索、匹配、替换
2. **三类积木**:字符类(匹配什么)+ 量词(匹配几次)+ 位置/分组
3. **\d \w \s** 是最常用的三个字符类,覆盖数字、单词、空白
4. **不需要从零写**:常见场景都有成熟的正则模式可以复用
5. **贪婪 vs 懒惰**:默认贪婪(多匹配),加 `?` 变懒惰(少匹配)
:::
**下一步学习**
- [环境变量与 PATH](./environment-path) - 理解系统配置
- [SSH 与密钥认证](./ssh-authentication) - 安全连接远程服务器