正则表达式详细介绍
一、正则表达式基础概念
正则表达式(Regular Expression,简称 Regex 或 RegExp)是一种用于匹配和处理文本的强大工具,它通过特定的字符组合来描述文本模式。在编程、文本编辑器、命令行工具等场景中广泛应用,可用于文本搜索、替换、验证等操作。
二、正则表达式基本语法
1.普通字符
定义:直接匹配字符本身,包括字母、数字、标点符号等。
示例:
abc:匹配字符串中的abc子串。
123:匹配数字123。
2.特殊字符(元字符)
元字符具有特殊含义,需配合转义符\使用才能匹配字面量。
| 字符 | 功能 | 说明 |
|---|---|---|
| . | 匹配任意单个字符(除换行符\n外) | a.c可匹配abc、a0c,但不匹配a\nc |
| ^ | 匹配字符串开头 | ^abc仅匹配以abc开头的字符串 |
| $ | 匹配字符串结尾 | abc$仅匹配以abc结尾的字符串 |
| * | 匹配前一个元素 0 次或多次 | a*b可匹配b(a 出现 0 次)、ab、aab等 |
| + | 匹配前一个元素 1 次或多次 | a+b可匹配ab、aab,但不匹配b |
| ? | 匹配前一个元素 0 次或 1 次 | a?b可匹配b、ab |
| {n} | 匹配前一个元素恰好 n 次 | a{2}b匹配aab |
| {n,} | 匹配前一个元素至少 n 次 | a{2,}b匹配aab、aaab等 |
| {n,m} | 匹配前一个元素 n 到 m 次 | a{1,3}b匹配ab、aab、aaab |
| [] | 字符集合,匹配其中任意一个字符 | [abc]匹配a、b或c |
| [^] | 否定字符集合,匹配不在其中的任意字符 | [^abc]匹配除a、b、c外的字符 |
| [-] | 字符范围 | [0-9]匹配任意一个数字 |
| \ | 转义符,使元字符变为普通字符 | .匹配.,*匹配* |
3.预定义字符类
为常见字符集合提供简写形式:
| 字符类 | 等价形式 | 说明 |
|---|---|---|
| \d | [0-9] | 匹配数字 |
| \D | [^0-9] | 匹配非数字 |
| \w | [a-zA-Z0-9_] | 匹配字母、数字或下划线 |
| \W | [^a-zA-Z0-9_] | 匹配非字母、数字或下划线 |
| \s | [ \t\n\r\f\v] | 匹配空白字符(空格、制表符、换行符等) |
| \S | [^ \t\n\r\f\v] | 匹配非空白字符 |
4.分组与反向引用
| 字符类 | 功能 | 说明 |
|---|---|---|
| () | 将多个元素组合为一个整体 | (ab)+匹配ab、abab、ababab等 |
| \n | 反向引用 | (n 为数字)引用分组内容,用于匹配重复模式。(\d)\1匹配两个连续相同数字(如11、22) |
| (?:) | 只分组不捕获,提升效率 | 匹配 1st, 2nd, 3rd, 4th,使用 ([0-9]+)(?:st|nd|rd|th)?。只有数字部分会被捕获 |
三、正则表达式高级用法
1.贪婪匹配与非贪婪匹配
贪婪与非贪婪匹配:默认情况下,量词(, +, ?, {})是贪婪的,会尽可能匹配更长的字符串。在量词后面加上一个 ?,就变为非贪婪(懒惰)模式,会尽可能匹配更短的字符串 。
例如,在字符串 "<div>content</div>"中,正则表达式 <.>会贪婪地匹配整个字符串 "<div>content</div>",而 <.*?>则会非贪婪地匹配开始标签 "<div>"和结束标签 "</div>"。
2.零宽断言
用于指定匹配的位置,不消耗字符:
| 断言类型 | 语法 | 含义 |
|---|---|---|
| 正向先行断言 | (?=pattern) | 匹配右侧是pattern的位置 |
| 负向先行断言 | (?!pattern) | 匹配右侧不是pattern的位置 |
| 正向后发断言 | (?<=pattern) | 匹配左侧是pattern的位置 |
| 负向后发断言 | (?<!pattern) | 匹配左侧不是pattern的位置 |
例如:\d+(?=分)匹配分数(如99分中的99)。
3.分支结构
使用|表示 "或" 关系,按顺序匹配分支。
示例:(https?|ftp)://匹配http://、https://或ftp://。
四、 常用正则表达式示例
| 用途 | 表达式 | 说明 |
|---|---|---|
| 电子邮箱 | ^\w+([.-]?\w+)@\w+([.-]?\w+)(.\w{2,3})+$ | 匹配常见的邮箱格式,如 username@example.com |
| 手机号码 | ^1[3-9]\d{9}$ | 匹配以1开头,第二位为3-9的中国大陆11位手机号 |
| 身份证号 | `^\d{15} | \d{18}$` |
| 中文字符 | ^[\u4e00-\u9fa5]+$ | 匹配一个或多个中文字符 |
| 空白行 | \n\s*\r | 匹配仅包含空白字符(空格、制表符)的行 |
| URL网址 | ^https?: //[\w.-]+(?:.[\w.-]+)+[/\w ./-]*$ | 匹配以 http://或 https://开头的URL |
| IP地址 | ^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$" | 匹配ip地址 |