正则表达式是一种强大的文本处理工具,用于匹配、搜索、替换、分割等多种操作。以下是正则表达式的基本组成和语法,以及如何使用它们来构建复杂的模式。
正则表达式语法
1. 基本字符匹配
- 普通字符: 大多数字符,如`a-z`、`A-Z`、`0-9`,直接匹配文本中的相应字符。
- 特殊字符: 如 `.`、`?`、`*`、`+`、`^`、`$`、`(`、`)`、`[`、`]`、`{`、`}`、`\`、`|`。这些符号在正则表达式中有特殊的含义,若要匹配它们本身,需要使用反斜线进行转义,例如 `\\`、`\.`。
2. 特殊字符
- `.`: 匹配除换行符以外的任意单个字符。
- `^`: 匹配输入字符串的开始位置。
- `$`: 匹配输入字符串的结束位置。
### 3. 字符类
- **`[abc]`**: 匹配方括号内的任何一个字符(在这里是`a`、`b`或`c`)。
- **`[^abc]`**: 匹配不在方括号内的任何字符。
- **`[a-z]`**: 匹配任何从`a`到`z`的小写字母。
- **`[A-Z]`**: 匹配任何从`A`到`Z`的大写字母。
- **`[0-9]`**: 匹配任何从`0`到`9`的数字。
### 4. 预定义字符类
- **`\d`**: 匹配任何数字,等价于`[0-9]`。
- **`\D`**: 匹配任何非数字字符,等价于`[^0-9]`。
- **`\s`**: 匹配任何空白字符(包括空格、制表符、换行符等)。
- **`\S`**: 匹配任何非空白字符。
- **`\w`**: 匹配任何单词字符(字母、数字以及下划线),等价于`[a-zA-Z0-9_]`。
- **`\W`**: 匹配任何非单词字符,等价于`[^a-zA-Z0-9_]`。
### 5. 量词
- **`*`**: 匹配前面的子表达式零次或多次。
- **`+`**: 匹配前面的子表达式一次或多次。
- **`?`**: 匹配前面的子表达式零次或一次。
- **`{n}`**: 匹配前面的子表达式确切`n`次。
- **`{n,}`**: 匹配前面的子表达式至少`n`次。
- **`{n,m}`**: 匹配前面的子表达式至少`n`次,但不超过`m`次。
### 6. 分组和引用
- **`(exp)`**: 匹配`exp`并捕获文本到自动命名的组里,它可以稍后通过反向引用被重新使用。
- **`(?:exp)`**: 匹配`exp`,但是不捕获匹配的文本,不分配组号。
### 7. 断言
- **`exp1(?=exp2)`**: 断言后面跟着能匹配`exp2`的位置。
- **`exp1(?!exp2)`**: 断言后面不跟着能匹配`exp2`的位置。
- **`(?<=exp2)exp1`**: 断言前面是能匹配`exp2`的位置。
- **`(?<!exp2)exp1`**: 断言前面不是能匹配`exp2`的位置。
### 8. 逻辑或
- **`exp1|exp2`**: 匹配`exp1`或`exp2`。
### 9. 转义
- **`\`**: 转义后面跟着的字符,取消其特殊意义。
使用这些构件,你可以构建从简单到复杂的正则表达式来进行有效的文本匹配和处理。正则表达式是一种功能强大但学习曲线相对陡峭的工具,实践是掌握它们的关键。
好的,让我给你举几个例子,包括这些构建的组合,并解释它们的含义:
1. **匹配邮箱地址**
- 正则表达式: `\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b`
- 解释:
- `\b`: 匹配单词边界,确保邮箱地址前后没有其他字符。
- `[A-Za-z0-9._%+-]+`: 匹配邮箱地址的用户名部分,可以包含字母、数字以及特殊字符`._%+-`,并且至少包含一个字符。
- `@`: 匹配邮箱地址中的@符号。
- `[A-Za-z0-9.-]+`: 匹配邮箱地址的域名部分,可以包含字母、数字以及特殊字符`.-`,并且至少包含一个字符。
- `\.`: 匹配邮箱地址中的点号(.),用于分隔域名中的各个部分。
- `[A-Z|a-z]{2,}`: 匹配邮箱地址的顶级域名部分,可以是大小写字母,至少包含两个字符。
- `\b`: 单词边界,确保邮箱地址的结束位置。
2. **匹配HTML标签内的文本内容**
- 正则表达式: `<([^>]+)>.*?<\/\1>`
- 解释:
- `<([^>]+)>`: 匹配HTML标签的开始部分,其中`[^>]+`匹配除了>之外的任意字符,括号用于捕获匹配到的标签名。
- `.*?`: 匹配标签内的任意文本,`*?`表示非贪婪匹配,尽可能少地匹配字符。
- `<\/\1>`: 匹配与之前捕获的标签名相匹配的结束标签。
3. **匹配日期和时间**
- 正则表达式: `\b\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\b`
- 解释:
- `\b`: 单词边界,确保日期和时间前后没有其他字符。
- `\d{4}-\d{2}-\d{2}`: 匹配YYYY-MM-DD格式的日期部分。
- `\s`: 匹配一个空白字符,用于分隔日期和时间。
- `\d{2}:\d{2}:\d{2}`: 匹配HH:MM:SS格式的时间部分。
这些例子展示了如何利用正则表达式的不同构建相互组合,以匹配复杂的文本模式。通过理解每个构建的含义和作用,你可以更有效地应用正则表达式来处理各种文本匹配和提取任务。
常用的正则表达式模式
当谈到正则表达式时,有一些常用的模式可以帮助你处理各种文本匹配和替换任务。这里我列举一些常用的正则表达式模式,以及它们的用途和示例。
1. **匹配数字**
- `\d+`: 匹配一个或多个数字字符。
- 示例:`"123"`, `"2022"`, `"9"`。
2. **匹配非数字字符**
- `\D+`: 匹配一个或多个非数字字符。
- 示例:`"Hello"`, `"abc"`。
3. **匹配字母**
- `[a-zA-Z]+`: 匹配一个或多个字母字符(不区分大小写)。
- 示例:`"Hello"`, `"world"`。
4. **匹配单词**
- `\b\w+\b`: 匹配一个完整的单词。
- 示例:`"Hello"`, `"world"`, `"123abc"`。
5. **匹配空白字符**
- `\s+`: 匹配一个或多个空白字符,如空格、制表符、换行符等。
- 示例:`"Hello World"`, `"Tab\tSeparated\tValues"`。
6. **匹配非空白字符**
- `\S+`: 匹配一个或多个非空白字符。
- 示例:`"HelloWorld123"`, `"abc@xyz.com"`。
7. **匹配邮箱地址**
- `\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b`: 匹配常见的邮箱地址格式。
- 示例:`"user@example.com"`, `"john.doe123@gmail.com"`。
8. **匹配URL**
- `\bhttps?://\S+\b`: 匹配常见的URL格式(HTTP或HTTPS)。
- 示例:`"https://www.example.com"`, `"http://google.com"`。
9. **匹配手机号码**
- `\b\d{3}[-.]?\d{3}[-.]?\d{4}\b`: 匹配常见的手机号码格式。
- 示例:`"123-456-7890"`, `"555.123.4567"`。
10. **匹配日期**
- `\b\d{4}-\d{2}-\d{2}\b`: 匹配YYYY-MM-DD格式的日期。
- 示例:`"2022-01-01"`, `"1990-12-31"`。
11. **匹配IP地址**
- `\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b`: 匹配IPv4地址。
- 示例:`"192.168.1.1"`, `"10.0.0.1"`。
12. **匹配中文字符**
- `[\u4e00-\u9fa5]+`: 匹配一个或多个中文字符。
- 示例:`"你好吗?"`, `"中文字符测试"`。
13. **匹配邮政编码**
- `\b\d{6}\b`: 匹配6位数字的邮政编码格式。
- 示例:`"100085"`, `"200010"`。
14. **匹配QQ号码**
- `\b[1-9][0-9]{4,}\b`: 匹配5位或更多位数字组成的QQ号码格式。
- 示例:`"123456789"`, `"9876543210"`。
15. **匹配身份证号码**
- `\b\d{17}[\d|X]|\d{15}\b`: 匹配18位或15位身份证号码格式。
- 示例:`"110101199003077657"`, `"31010119900101001X"`。
16. **匹配货币金额**
- `\b\d+(,\d{3})*(\.\d{1,2})?\b`: 匹配货币金额,可以包含逗号分隔的千位分隔符和小数点后两位。
- 示例:`"$1,234.56"`, `"¥12,345,678.90"`。
17. **匹配HTML标签**
- `<[^>]+>`: 匹配HTML标签及其内容。
- 示例:`"<p>Hello</p>"`, `"<a href="https://www.example.com">Link</a>"`。
18. **匹配XML标签**
- `<\s*([^\s>]+)[^>]*>.*?<\/\1\s*>`: 匹配XML标签及其内容。
- 示例:`"<book>Title</book>"`, `"<person><name>John</name></person>"`。
这些正则表达式模式可以帮助你处理更多的文本匹配和提取任务,例如验证身份证号码、匹配HTML/XML标签等。在使用时,根据具体情况进行调整和组合,以满足你的需求。