正则表达式(Regular Expression)教程
正则表达式(简称 Regex 或 RegExp)是一种强大的文本匹配工具,用于描述字符串的模式。它可以用来搜索、替换、验证和提取文本,在编程语言(如 JavaScript、Python、Java 等)和工具(如 grep、sed)中广泛应用。
1. 基本概念
- 普通字符:直接匹配自身,例如
abc匹配字符串中的 “abc”。 - 元字符:具有特殊含义的字符,需要转义来匹配字面值(如
\.匹配点号)。 - 正则表达式通常用
/pattern/或构造函数创建(如new RegExp('pattern'))。
2. 常用元字符和语法
以下是常见元字符表格:
| 元字符 | 描述 | 示例 | 匹配示例 |
|---|---|---|---|
. | 匹配任意单个字符(除换行符) | a.b | “aab”、”a1b” |
^ | 匹配字符串开头 | ^abc | “abcde” 中的 “abc” |
$ | 匹配字符串结尾 | abc$ | “xyzabc” 中的 “abc” |
* | 匹配前一个字符 0 次或多次 | ab* | “a”、”ab”、”abbb” |
+ | 匹配前一个字符 1 次或多次 | ab+ | “ab”、”abb”(不匹配 “a”) |
? | 匹配前一个字符 0 次或 1 次 | ab? | “a”、”ab” |
{n} | 匹配前一个字符正好 n 次 | a{3} | “aaa” |
{n,} | 匹配前一个字符至少 n 次 | a{2,} | “aa”、”aaa” 等 |
{n,m} | 匹配前一个字符 n 到 m 次 | a{2,4} | “aa”、”aaa”、”aaaa” |
[] | 字符集合,匹配括号内任意一个 | [abc] | “a”、”b” 或 “c” |
[^] | 否定集合,匹配不在括号内的 | [^abc] | 除 “a/b/c” 外的字符 |
| | 或(分支) | a|b | “a” 或 “b” |
() | 分组(捕获) | (ab)+ | “ab”、”abab” 等 |
\d | 匹配数字 [0-9] | \d+ | “123” |
\D | 匹配非数字 | \D+ | “abc” |
\w | 匹配字母、数字、下划线 [A-Za-z0-9_] | \w+ | “hello_123” |
\W | 匹配非 \w | ||
\s | 匹配空白字符(空格、Tab、换行) | \s+ | ” ” 或 “\t” |
\S | 匹配非空白 | ||
\b | 单词边界 | \bword\b | 完整单词 “word” |
\B | 非单词边界 |
- 转义:用
\转义元字符,例如\.匹配 “.”,\\匹配 “\”。 - 修饰符(Flags):
i:忽略大小写。g:全局匹配。m:多行模式(^ 和 $ 匹配每行开头/结尾)。- 示例:
/abc/i匹配 “ABC”。
3. 高级用法
- 贪婪与懒惰:默认贪婪(匹配尽可能多),加
?变为懒惰(匹配尽可能少)。 - 贪婪:
a.*b匹配 “a123b456b” 中的 “a123b456b”。 - 懒惰:
a.*?b匹配 “a123b”。 - 零宽断言(看断言,不消耗字符):
(?=pattern):正向前瞻,例如a(?=\d)匹配后面跟数字的 “a”。(?!pattern):负向前瞻。(?<=pattern):正向后瞻。(?<!pattern):负向后瞻。- 分组与引用:
(pattern):捕获组,可用\1、\2引用。(?:pattern):非捕获组。
4. 常见示例
- 匹配邮箱:
^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$ - 匹配手机号(中国):
^1[3-9]\d{9}$ - 匹配 URL:
^https?://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$ - 替换:将字符串中的数字加1(需编程实现)。
5. 实践建议
- 使用在线工具测试:如 regex101.com、regexper.com。
- 不同语言/引擎略有差异(如 PCRE、JavaScript、Python),注意兼容性。
- 推荐资源:
- 《正则表达式30分钟入门教程》(deerchao.cn/tutorials/regex/regex.htm)——经典入门,深入浅出。
- 菜鸟教程:https://www.runoob.com/regexp/regexp-tutorial.html ——有在线测试。
- MDN JavaScript 正则:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Regular_expressions
多练习是掌握正则的关键!如果有具体问题或示例需求,随时问我。