正则表达式手册(Regex)
正则表达式(Regular Expressions,简称 Regex)是一种用于匹配字符串的模式。它在文本处理、数据验证和提取等方面非常强大和灵活。以下是详细的 Regex 语法手册,并附有示例说明。
基本字符匹配
- 字符:直接匹配字符本身。例如:
a
匹配字符串 "a"。abc
匹配字符串 "abc"。
元字符
.
:匹配除换行符以外的任意单个字符。a.b
匹配 "aab", "acb" 等。
\
:转义字符,用于转义元字符,使其失去特殊意义。a\.b
匹配 "a.b"。
字符类
[]
:匹配方括号内的任意一个字符。[abc]
匹配 "a", "b", "c" 中的任意一个。
[^]
:匹配不在方括号内的任意一个字符。[^abc]
匹配除 "a", "b", "c" 以外的任意一个字符。
- 范围:在方括号内使用
-
指定字符范围。[a-z]
匹配小写字母。[0-9]
匹配数字。
预定义字符类
\d
:匹配任何数字,相当于[0-9]
。\d{3}
匹配任何三位数字,如 "123"。
\D
:匹配任何非数字字符,相当于[^0-9]
。\D
匹配 "a", "-" 等非数字字符。
\w
:匹配任何字母、数字或下划线,相当于[a-zA-Z0-9_]
。\w+
匹配一个或多个字母、数字或下划线。
\W
:匹配任何非字母、数字或下划线字符,相当于[^a-zA-Z0-9_]
。\W
匹配 "!", "@" 等特殊字符。
\s
:匹配任何空白字符(包括空格、制表符、换行符等)。\s
匹配 " ", "\t" 等。
\S
:匹配任何非空白字符,相当于[^ \t\n\r\f\v]
。\S
匹配 "a", "1" 等非空白字符。
数量词
*
:匹配前面的字符零次或多次。a*
匹配 "", "a", "aa" 等。
+
:匹配前面的字符一次或多次。a+
匹配 "a", "aa" 等。
?
:匹配前面的字符零次或一次。a?
匹配 "", "a"。
{n}
:匹配前面的字符恰好 n 次。a{3}
匹配 "aaa"。
{n,}
:匹配前面的字符至少 n 次。a{2,}
匹配 "aa", "aaa" 等。
{n,m}
:匹配前面的字符至少 n 次,但不超过 m 次。a{2,4}
匹配 "aa", "aaa", "aaaa"。
边界匹配
^
:匹配字符串的开始。^abc
匹配以 "abc" 开头的字符串。
$
:匹配字符串的结束。abc$
匹配以 "abc" 结尾的字符串。
\b
:匹配单词边界。\bword\b
匹配单词 "word"。
\B
:匹配非单词边界。\Bword\B
匹配 "password" 中的 "word"。
分组和引用
()
:分组,用于提取子字符串或应用数量词。(abc)+
匹配 "abc", "abcabc"。
\1
,\2
, ...:反向引用,用于匹配之前的捕获组。(a)(b)\1\2
匹配 "abab"。
或匹配
|
:匹配左边或右边的字符。a|b
匹配 "a" 或 "b"。
零宽断言
(?=...)
:正向前瞻断言,要求接下来的字符与 ... 匹配,但不消耗这些字符。a(?=b)
匹配 "a" 仅当其后跟着 "b"。
(?!...)
:负向前瞻断言,要求接下来的字符不与 ... 匹配。a(?!b)
匹配 "a" 仅当其后不跟着 "b"。
(?<=...)
:正向后瞻断言,要求前面的字符与 ... 匹配,但不消耗这些字符。(?<=a)b
匹配 "b" 仅当其前面是 "a"。
(?<!...)
:负向后瞻断言,要求前面的字符不与 ... 匹配。(?<!a)b
匹配 "b" 仅当其前面不是 "a"。
贪婪与懒惰匹配
- 贪婪匹配:尽可能多地匹配字符,默认行为。
a.*b
匹配 "a" 开头和 "b" 结尾的最长字符串。
- 懒惰匹配:尽可能少地匹配字符,在量词后加
?
实现。a.*?b
匹配 "a" 开头和 "b" 结尾的最短字符串。
示例汇总
- 匹配邮箱地址:
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
- 解释:匹配类似 "example@example.com" 的邮箱地址。
- 匹配电话号码:
^\d{3}-\d{3}-\d{4}$
- 解释:匹配类似 "123-456-7890" 的电话号码。
- 匹配日期(YYYY-MM-DD):
^\d{4}-\d{2}-\d{2}$
- 解释:匹配类似 "2024-06-17" 的日期格式。