正则表达式学习与面试指南

157 阅读2分钟

正则表达式学习与面试指南

基础学习

正则表达式(Regex)是强大的文本处理工具,通过简单的符号规则实现复杂的文本匹配、查找和替换。

核心匹配规则

符号作用示例记忆口诀
abc匹配具体字符"a" → a字面匹配
.匹配任意字符"a.c" → abc点代表任意
\d匹配数字\d → 0d=digit
\w匹配字母、数字、下划线\w → aw=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 → catb=boundary

分组与逻辑

符号作用例子口诀
(abc)分组,后续可引用(ab)+abab括号分组
``逻辑或`a

转义符:匹配特殊符号

符号作用例子口诀
``转义符号本身(如 .*. → 匹配 .反斜杠转义

全局匹配模式

标志作用例子口诀
g全局匹配(所有结果)/a/g → 所有 ag 是 global
i忽略大小写/a/iA/ai 是 ignore case

实战面试题

腾讯校招笔试题

var s = 'abc345efgabcab';

// 1) 去掉a、b、c字符 → '345efg'
s.replace(/[abc]/g, '');

// 2) 数字用中括号括起 → 'abc[345]efgabcab'
s.replace(/\d+/g, '[$&]');

// 3) 每个数字乘以2 → 'abc6810efgabcab'
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)); // 输出:我是张三,年龄18,性别男

常见面试问题

基础题

  1. 匹配数字:\d 或 [0-9]
  2. 匹配非数字:\D 或 [^0-9]
  3. 匹配单词字符:\w(字母、数字、下划线)
  4. 匹配空白符:\s(空格、换行等)
  5. 匹配任意字符:.

进阶题

  1. 邮箱匹配:/\w+@\w+.[a-z]+/i
  2. 手机号匹配:/^1[3-9]\d{9}$/
  3. URL匹配:/https?://[\w-.]+(/[\w-.]*)*/i
  4. HTML标签:/<[^>]+>/
  5. 日期匹配:/\d{4}-\d{2}-\d{2}/

实战题

  1. 删除所有空格:str.replace(/\s/g, '')
  2. 提取所有数字:str.match(/\d+/g)
  3. 密码强度验证(8位含大小写和数字):
    /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,}$/
  4. 匹配ing结尾单词:/\b\w+ing\b/g
  5. 匹配中文汉字:/[\u4e00-\u9fa5]/

快速记忆口诀

.任意,\d数字,\w字,\s空
[]选一个,^开头$结尾
*零或多,+一或多,?零或一
{}次数定,|是或,()分组用
\要转义,g全局i不区分

掌握这些核心概念后,正则表达式将成为你文本处理的强大工具!