正则表达式学习与面试指南
基础学习
正则表达式(Regex)是强大的文本处理工具,通过简单的符号规则实现复杂的文本匹配、查找和替换。
核心匹配规则
| 符号 | 作用 | 示例 | 记忆口诀 |
|---|
abc | 匹配具体字符 | "a" → a | 字面匹配 |
. | 匹配任意字符 | "a.c" → abc | 点代表任意 |
\d | 匹配数字 | \d → 0 | d=digit |
\w | 匹配字母、数字、下划线 | \w → a | w=word |
\s | 匹配空白符 | \s → 空格 | s=space |
[abc] | 匹配括号中任意字符 | [ae] → a | 中括号选一个 |
[^abc] | 匹配不在括号中的字符 | [^ae] → b | ^表示取反 |
[a-z] | 匹配范围内的字符 | [0-9] → 数字 | 连字符表范围 |
量词规则
| 符号 | 作用 | 示例 | 记忆口诀 |
|---|
* | 0次或多次 | a* → ""/a | 星号零或多 |
+ | 1次或多次 | a+ → a | 加号至少一 |
? | 0次或1次 | a? → ""/a | 问号可有可无 |
{n} | 恰好n次 | a{3} → aaa | 花括号精确 |
{n,} | 至少n次 | a{2,} → aa | 逗号表下限 |
{n,m} | n到m次 | a{2,4} → aa | 逗号分隔范围 |
位置匹配
| 符号 | 作用 | 示例 | 记忆口诀 |
|---|
^ | 字符串开头 | ^a → 开头的a | ^是开头 |
$ | 字符串结尾 | a$ → 结尾的a | $是结尾 |
\b | 单词边界 | \bcat\b → cat | b=boundary |
分组与逻辑
| 符号 | 作用 | 例子 | 口诀 |
|---|
(abc) | 分组,后续可引用 | (ab)+ → abab | 括号分组 |
| ` | ` | 逻辑或 | `a |
转义符:匹配特殊符号
| 符号 | 作用 | 例子 | 口诀 |
|---|
| `` | 转义符号本身(如 .、*) | . → 匹配 . | 反斜杠转义 |
全局匹配模式
| 标志 | 作用 | 例子 | 口诀 |
|---|
g | 全局匹配(所有结果) | /a/g → 所有 a | g 是 global |
i | 忽略大小写 | /a/i → A/a | i 是 ignore case |
实战面试题
腾讯校招笔试题
var s = 'abc345efgabcab';
s.replace(/[abc]/g, '');
s.replace(/\d+/g, '[$&]');
s.replace(/\d/g, digit => digit * 2);
百度面试题:模板渲染
function compile(template, data) {
return template.replace(/{{([a-zA-Z]+)}}/g, (match, key) =>
data[key] !== undefined ? data[key] : match
);
}
let str = '我是{{name}},年龄{{age}},性别{{sex}}';
let person = { name: '张三', age: 18, sex: '男' };
console.log(compile(str, person));
常见面试问题
基础题
- 匹配数字:
\d 或 [0-9]
- 匹配非数字:
\D 或 [^0-9]
- 匹配单词字符:
\w(字母、数字、下划线)
- 匹配空白符:
\s(空格、换行等)
- 匹配任意字符:
.
进阶题
- 邮箱匹配:
/\w+@\w+.[a-z]+/i
- 手机号匹配:
/^1[3-9]\d{9}$/
- URL匹配:
/https?://[\w-.]+(/[\w-.]*)*/i
- HTML标签:
/<[^>]+>/
- 日期匹配:
/\d{4}-\d{2}-\d{2}/
实战题
- 删除所有空格:
str.replace(/\s/g, '')
- 提取所有数字:
str.match(/\d+/g)
- 密码强度验证(8位含大小写和数字):
/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,}$/
- 匹配ing结尾单词:
/\b\w+ing\b/g
- 匹配中文汉字:
/[\u4e00-\u9fa5]/
快速记忆口诀
.任意,\d数字,\w字,\s空
[]选一个,^开头$结尾
*零或多,+一或多,?零或一
{}次数定,|是或,()分组用
\要转义,g全局i不区分
掌握这些核心概念后,正则表达式将成为你文本处理的强大工具!