正则表达式完全指南

ops/2025/1/14 19:42:32/

# 正则表达式完全指南

正则表达式(Regular Expression,简称 regex 或 regexp)是一种强大的文本匹配和处理工具。它使用特定的语法规则来描述字符串的匹配模式,广泛应用于文本搜索、替换和数据验证等场景。

## 1. 基础语法

### 1.1 字符匹配

- `.` - 匹配任意单个字符(除换行符外)

- `\d` - 匹配任意数字(0-9)

- `\D` - 匹配任意非数字

- `\w` - 匹配字母、数字、下划线

- `\W` - 匹配非字母、数字、下划线

- `\s` - 匹配任意空白字符(空格、制表符、换行符)

- `\S` - 匹配任意非空白字符

### 1.2 数量限定符

- `*` - 匹配前面的表达式 0 次或多次

- `+` - 匹配前面的表达式 1 次或多次

- `?` - 匹配前面的表达式 0 次或 1 次

- `{n}` - 精确匹配 n 次

- `{n,}` - 匹配至少 n 次

- `{n,m}` - 匹配 n 到 m 次

### 1.3 位置匹配

- `^` - 匹配行的开始

- `$` - 匹配行的结束

- `\b` - 匹配单词边界

- `\B` - 匹配非单词边界

## 2. 高级语法

### 2.1 字符类

- `[abc]` - 匹配方括号中的任意一个字符

- `[^abc]` - 匹配除了方括号中字符的任意字符

- `[a-z]` - 匹配 a 到 z 的任意小写字母

- `[A-Z]` - 匹配 A 到 Z 的任意大写字母

- `[0-9]` - 匹配任意数字

### 2.2 分组和引用

- `(pattern)` - 捕获组,可以通过 \1, \2 等引用

- `(?:pattern)` - 非捕获组

- `(?=pattern)` - 正向预查

- `(?!pattern)` - 负向预查

- `(?<=pattern)` - 正向后查

- `(?<!pattern)` - 负向后查

### 2.3 或运算

- `|` - 匹配左边或右边的表达式

## 3. 常用实例

### 3.1 验证常见格式

```regex

# 电子邮件

^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$

# 手机号码(中国)

^1[3-9]\d{9}$

# 身份证号(中国)

^[1-9]\d{5}(19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dX]$

# 日期格式(YYYY-MM-DD)

^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$

# URL

^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$

```

### 3.2 文本处理示例

```regex

# 提取HTML标签

<[^>]+>

# 匹配双字节字符(包括汉字)

[^\x00-\xff]

# 删除多余空格

\s{2,}

# 提取引号中的内容

"[^"]*"

```

## 4. 使用技巧

### 4.1 性能优化

1. 避免过度使用贪婪匹配

2. 合理使用非捕获组 (?:)

3. 尽量使用具体的字符类而不是通配符

4. 避免过度使用回溯

### 4.2 常见陷阱

1. 贪婪匹配vs懒惰匹配

   - 贪婪匹配:`.*`、`.+`

   - 懒惰匹配:`.*?`、`.+?`

2. 特殊字符转义

   - 需要转义的字符:`. * + ? ^ $ [ ] ( ) { } | \ /`

   - 使用 `\` 进行转义

3. 环视断言使用注意事项

   - 环视不消耗字符

   - 环视只用于判断位置

## 5. 在不同编程语言中的使用

### 5.1 JavaScript

```javascript

// 创建正则表达式

let regex1 = /pattern/flags;

let regex2 = new RegExp('pattern', 'flags');

// 常用方法

string.match(regex)     // 查找匹配项

string.replace(regex)   // 替换匹配项

regex.test(string)      // 测试是否匹配

regex.exec(string)      // 执行匹配

```

### 5.2 Python

```python

import re

# 常用方法

re.match(pattern, string)    # 从开始位置匹配

re.search(pattern, string)   # 搜索整个字符串

re.findall(pattern, string)  # 查找所有匹配

re.sub(pattern, repl, string)# 替换匹配项

```

## 6. 调试与测试

### 6.1 在线工具推荐

1. regex101.com - 实时测试和调试

2. regexr.com - 交互式学习

3. debuggex.com - 可视化展示

### 6.2 测试要点

1. 边界情况测试

2. 特殊字符处理

3. 性能测试

4. 多语言环境测试

## 总结

正则表达式是一个强大的文本处理工具,掌握它可以大大提高文本处理效率。关键是要:

1. 理解基本语法和特殊字符的含义

2. 多练习,积累常用表达式

3. 注意性能优化

4. 考虑可维护性

5. 适当使用在线工具辅助开发和调试

记住:编写正则表达式时应该遵循"简单够用"的原则,过于复杂的正则表达式往往会带来维护困难和性能问题。


http://www.ppmy.cn/ops/150083.html

相关文章

在 Safari 浏览器中,快速将页面恢复到 100% 缩放(也就是默认尺寸)Command (⌘) + 0 (零)

在 Safari 浏览器中&#xff0c;没有一个专门的快捷键可以将页面恢复到默认的缩放比例。 但是&#xff0c;你可以使用以下两种方法快速将页面恢复到 100% 缩放&#xff08;也就是默认尺寸&#xff09;&#xff1a; 方法一&#xff1a;使用快捷键 (最常用) Command (⌘) 0 (零…

C++实现设计模式---代理模式 (Proxy)

代理模式 (Proxy) 代理模式 是一种结构型设计模式&#xff0c;它为其他对象提供一个代理以控制对该对象的访问。代理模式常用于延迟加载、访问控制、智能引用等场景。 意图 提供对某对象的控制。控制对目标对象的访问&#xff0c;通常用于在不改变目标对象的情况下&#xff0…

第21篇 基于ARM A9处理器用汇编语言实现中断<三>

Q&#xff1a;怎样编写ARM A9处理器汇编语言代码配置按键端口产生中断&#xff1f; A&#xff1a;使用Intel Monitor Program创建中断程序时&#xff0c;Linker Section Presets下拉菜单中需选择Exceptions。主程序在.vectors代码段为ARM处理器设置异常向量表&#xff0c;在…

大语言模型预训练、微调、RLHF

转发&#xff0c;如有侵权&#xff0c;请联系删除&#xff1a; 1.【LLM】3&#xff1a;从零开始训练大语言模型&#xff08;预训练、微调、RLHF&#xff09; 2.老婆饼里没有老婆&#xff0c;RLHF里也没有真正的RL 3.【大模型微调】一文掌握7种大模型微调的方法 4.基于 Qwen2.…

ref useRef React.createRef React.forwardRef

react如何获取真实DOM&#xff1a;useRef, React.CreateRef() access DOM nodes directly within React&#xff1a;ref.current Let’s say you want to change the value of an <input> element, but without using props or re-rendering the whole component. They’…

PyCharm 的安装与使用(Window)

1 PyCharm 简介 PyCharm 是一款由 JetBrains 公司开发的专门用于 Python 语言开发的集成开发环境&#xff08;IDE&#xff09;。以下是其相关介绍&#xff1a; 1.1 特点与功能 智能代码编辑&#xff1a;提供高度智能化的代码编辑器&#xff0c;支持语法高亮、自动补全、代码重…

四阶龙格库塔法求解二元二阶常微分方程

龙格库塔法&#xff08;Runge-Kutta methods&#xff09;是用于非线性常微分方程的解的重要的一类隐式或显式迭代法。在工程领域应用广泛&#xff0c;可用于求解复杂系统的运动方程等问题。 这里采用matlab程序编写代码实现龙格库塔法对于二元二阶常微分方程的求解。 例 { x …

Qt重写webrtc的demo peerconnection

整个demo为&#xff1a; 可以选择多个编码方式&#xff1a; cmake_minimum_required(VERSION 3.5)project(untitled LANGUAGES CXX) set(CMAKE_CXX_STANDARD 20) set(CMAKE_INCLUDE_CURRENT_DIR ON)set(CMAKE_AUTOUIC ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON)set(CMA…