6098908eee
- 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
179 lines
4.6 KiB
Markdown
179 lines
4.6 KiB
Markdown
# 正则表达式
|
||
|
||
> 💡 **学习指南**:正则表达式看起来像天书?其实它只是一种"描述文本模式"的迷你语言。本章带你从零开始理解正则的核心思想,学会用几个关键符号解决 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) - 安全连接远程服务器
|