1. 概念
正则表达式是一种特殊的字符串模式,用于查找和匹配文本中的特定字符组合。它由一系列字符和特殊字符组成,用于定义匹配规则。
注:学习时可结合正则可视化界面进行理解,菜鸟正则可视化工具
2. 常用符号
| 符号 | 说明 | 示例 |
|---|---|---|
| 普通字符 | 可以是字母、数字或标点符号。它们在正则表达式中直接匹配相同的字符 | abc只能匹配abc123只能匹配123 |
| 锚定符 | ||
^ | 前置锚点,匹配字符串的开始位置,写在字符串前面 | ^abc:匹配abc开头的字符串,如abcxyz |
$ | 后置锚点,匹配字符串的结束位置,写在字符串后面 | xyz$:匹配以xyz结尾的字符串,如abcxyz |
^$ | 利用前后锚点实现模式完全匹配,非特殊需求必加,若不加则代表只要包含该模式就可匹配 | ^abc$:匹配只包含 "abc" 的字符串,即abc^\d{3}$:匹配只包含3个数字的字符串^\w+$:匹配只包含一个或多个字母、数字或下划线的字符串,可匹配hello_world123,不能匹配hello world |
| 元字符 | ||
. | 匹配任意单个字符 | ab.可匹配aba |
\ | 转义符,所有的特殊字符如果要匹配其本身都得加\ | \.:匹配 .\/:匹配 /\::匹配 :\\:匹配 "\"\[:匹配 [\?:匹配 ?\*:匹配 *\<:匹配 <\+:匹配 + |
\d | 匹配任意数字(digit) | ab\d可匹配ab1\d{3}可匹配123、532等 |
\w | 匹配任意字母、数字和下划线(word),相当于[a-zA-Z0-9_] | ab\w可匹配ab_ |
\s | 匹配任意空白字符,包括空格、制表符、换行符等(string) | ab\s可匹配ab 、ab\t、ab\n |
| 重复符号 | ||
* | 匹配前面的元素0次或多次 | ca*t可匹配 ct、cat、caat、caaat等 |
+ | 匹配前面的元素1次或多次 | ca+t可匹配cat、caat、caaat等 |
? | 匹配前面的元素0次或1次 | ca?t可匹配ct、cat |
{n} | 匹配前面的元素恰好 n 次 | ca{2}t只能匹配caat |
{n,} | 匹配前面的元素至少 n 次~ | ca{2,}t可匹配caat、caaat等 |
{n,m} | 匹配前面的元素至少 n 次,至多 m 次 | ca{2,4}t只能匹配caat、caaat、caaaat |
| 字符类 | ||
[] | 匹配其中的任意一个字符 | [abc] 可以匹配字符串中的 "a"、"b" 或 "c" 中的任意一个字符 |
[^] | 匹配除括号内的字符以外的任意字符 | [^abc] 可以匹配除了 "a"、"b" 和 "c" 之外的任意字符 |
| 分组符 | 用于分组操作 | |
() | 将括号内模式视为一个整体应用,从而实现整体操作,如重复、捕获、引用等 | (ab丨cd)*表示匹配一个或多个 "ab" 或 "cd" 的连续组合 |
| 断言符 | 用于更灵活地指定匹配条件 | |
\b | 单词边界断言 | \bword\b 表示匹配独立的单词 "word",而不是包含在其他单词中的部分 |
\B | 非单词边界断言 | \Bing\B 表示匹配字符串中任意 "ing" 出现的位置,但不匹配 "string" 中的 "ing" |
(?=pattern) | 正向肯定前瞻断言,用于匹配满足指定模式的位置,但不消耗匹配项 | \d+(?=px) 匹配数字后面紧跟 "px"的字符串,如123px,不能匹配123px123 |
(?!pattern) | 正向否定前瞻断言,用于匹配不满足指定模式的位置,不消耗匹配项 | \d+(?!px) 匹配数字不能紧跟 "px" |
(?<=pattern) | 反向肯定后顾断言,用于匹配位于指定模式前面的内容,不消耗匹配项 | (?<=@)\w+ 匹配以 "@" 开头的单词 |
(?<!pattern) | 反向否定后顾断言,用于匹配不位于指定模式前面的内容,不消耗匹配项 | (?<!@)\w+ 匹配不以 "@" 开头的单词 |
| 特殊用法 | ||
[a-zA-Z] | 匹配任意一个字母,也可以写作[A-Za-z] | |
[0-9] | 匹配任意一个数字 | |
[a-zA-Z0-9] | 匹配任意一个字母或数字 | |
.* | 匹配任意字符(除了换行符)零次或多次 | .*[a-zA-Z]:匹配零个或多个任意字符(除换行符外),后跟至少一个字母(大小写不限) |
3. 编写练习
以下题目难度由低到高
-
匹配一个有效的日期(格式为 YYYY-MM-DD)。
# 知识点:^$、{n} ^\d{4}-\d{2}-\d{2}$ -
匹配一个有效的手机号码。
# 知识点:[] ^1[3456789]\d{9}$ -
匹配一个包含至少一个元音字母的单词
# 知识点:\b \b\w*[aeiou]\w*\b -
匹配一个有效的IP地址。
# 知识点:| ^((([1-9]|1\d|2[0-4])?\d|25[0-5])\.){3}(([1-9]|1\d|2[0-4])?\d|25[0-5])$ -
匹配一个只包含数字和逗号的字符串.
# 知识点:() ^\d+(,\d+)*$ -
匹配一个有效的邮箱地址。
# 知识点 \. ^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$ -
匹配一个有效的密码(要求包含大小写字母、数字和特殊字符)
# 知识点 (?=pattern) ^(?=.[a-zA-Z])(?=.\d)(?=.*[^a-zA-Z0-9]).{8,}$ -
匹配一个有效的URL。
# 知识点:\/ ^(http|https|ftp):\/\/[a-zA-Z0-9]+(\.[a-zA-Z0-9]+)*(\:[0-9]+)?(\/[^\s]*)?(\?[^\s]*)?(#[^\s]*)?$