正则表达式完全指南

devtools/2025/1/12 17:32:07/

# 正则表达式完全指南

正则表达式(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/devtools/149931.html

相关文章

Ruby语言的正则表达式

Ruby语言的正则表达式详解 正则表达式&#xff08;Regular Expressions&#xff0c;简称Regex&#xff09;是一种强大的文本处理工具&#xff0c;它可以用来匹配、搜索、替换字符串中的模式。在Ruby语言中&#xff0c;正则表达式的使用非常灵活&#xff0c;并且具有良好的可读…

索引页与B+树的关系

在数据库管理系统中&#xff0c;索引是优化查询性能的核心机制。B树作为一种高效索引结构&#xff0c;与索引页的关联至关重要。下面将详细解释它们之间的关系&#xff1a; 索引页&#xff08;Index Page&#xff09; 索引页是数据库中磁盘块&#xff08;Block&#xff09;的一…

python无需验证码免登录12306抢票 --selenium(2)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 [TOC](python无需验证码免登录12306抢票 --selenium(2)) 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 就在刚刚我抢的票&#xff1a;2025年1月8日…

Apache Hop从入门到精通 第一课 揭开Apache Hop神秘面纱

一、Apache Hop是什么&#xff1f; 1、Apache Hop&#xff0c;简称Hop&#xff0c;全称为Hop Orchestration Platform&#xff0c;即Hop 工作编排平台&#xff0c;是一个数据编排和数据工程平台&#xff0c;旨在促进数据和元数据编排的所有方面。Hop让你专注于你想要解决的问题…

ffmpeg常用命令及介绍

FFmpeg 是一个非常强大的多媒体处理工具&#xff0c;可以用来进行视频和音频的转换、剪辑、合并、提取等多种操作。以下是一些常用的 FFmpeg 命令及其功能介绍&#xff1a; 1. 基本命令结构 FFmpeg 的基本命令结构如下&#xff1a; ffmpeg [全局选项] [输入文件选项] -i 输入…

北航:将LLM的注意力从MHA转为GQA

&#x1f4d6;标题&#xff1a;Align Attention Heads Before Merging Them: An Effective Way for Converting MHA to GQA &#x1f310;来源&#xff1a;arXiv, 2412.20677 &#x1f31f;摘要 &#x1f538;大型语言模型已被证明在各种自然语言处理问题上表现良好。然而&am…

Python中如何使用正则表达式进行字符串匹配和替换?

在Python中&#xff0c;正则表达式是一种强大的工具&#xff0c;用于处理字符串的搜索、替换和分割等操作。Python的re模块提供了丰富的函数来支持这些功能。下面将详细介绍如何使用正则表达式进行字符串匹配和替换&#xff0c;并给出具体的示例。 1. 导入re模块 首先&#x…

PyCharm文档管理

背景&#xff1a;使用PyCharmgit做文档管理 需求&#xff1a;需要PyCharm自动识别docx/xslx/vsdx等文件类型&#xff0c;并在PyCharm内点击文档时唤起系统内关联应用(如word、excel、visio) 设置步骤&#xff1a; 1、file -》 settings -》file types 2、在Files opened i…