
今天我把自己从0学正则的“笨办法”掰碎了讲——不用背复杂公式,先搞懂“正则到底是啥”,再跟着“常用场景”练,保准你看完就能上手用,解决80%的文本处理问题。
先搞懂正则的“底层逻辑”:它其实是“文本找规律的公式”
我当年学正则时走了个大弯路:盯着教程背“元字符表”,什么“^是开头”“$是 ”,背了三天全忘光。后来帮朋友整理客户名单时才突然明白——正则根本不是“要背的符号”,而是“把我们想找的‘文本规律’翻译成电脑能懂的语言”。比如我们想找11位手机号,规律是“开头是1,第二位是3-9,后面跟9个数字”,那正则就是“1[3-9]d{9}”——拆开来讲:
去年我帮做电商运营的朋友处理用户留言,里面的手机号格式乱得离谱:有的带括号“(138)12345678”,有的带横杠“158-1234-5678”,甚至还有“我的电话是13912345678哦”——我用“1[3-9]d{9}”这个正则,5分钟就把所有11位数字提出来了,比她手动删符号快了10倍。朋友当时瞪着眼说“你这是魔法吧”,我笑着说“这就是正则的本质:帮电脑‘看懂’你要找的规律”。
其实MDN( Mozilla 开发者网络)文档里早说过:“正则表达式是一种匹配模式,描述一个字符串的规则”。 你不用管电脑怎么想,只要把“你要找的文本长什么样”用符号写出来,电脑就会帮你找——这跟你跟朋友说“帮我找个穿红衣服的人”是一个道理,只不过电脑要的是“符号化的描述”。
从“常用场景”学正则:先解决你最需要的问题
我见过很多人学正则的误区:先学“所有符号”,再学“复杂语法”,结果学了半个月还不会用。其实最有效的方法是“从场景出发”——先解决你当下最需要的问题,比如“提取手机号”“过滤广告”“批量改格式”,用这些场景倒逼自己学对应的规则,既记得牢,又能马上用。
场景1:提取手机号/邮箱——最常用的“精准匹配”
不管是做运营、爬虫还是行政,“提取关键信息”都是最常用的需求。比如提取手机号,除了前面说的“1[3-9]d{9}”,你还可以加个“全局匹配”(在正则后面加“g”),这样能把文本里所有的手机号都提出来。我之前帮一个教育机构的老师处理家长留言,里面有几百条“我的电话是13812345678”“联系我15998765432”,用这个正则一键提取,直接导出成Excel,省了她一下午的时间。
再比如提取邮箱,规律是“用户名+@+域名+后缀”,对应的正则是“w+@w+.w+(.w+)?”——这里要注意“(.w+)?”:有的邮箱是“xxx@xxx.com.cn”这种双后缀,“?”代表“0次或1次”,所以能匹配到“com.cn”“net.cn”这种情况。我自己写公众号的时候,经常要从读者留言里提取邮箱发资料,用这个正则从来没漏过。
场景2:过滤无效内容——用正则“剔除杂音”
你有没有遇到过这种情况?复制网页内容到Word,里面全是“”“””这种HTML转义字符,或者一堆没用的广告“点击关注领取福利”?正则能帮你“一键清杂音”。比如过滤HTML转义字符,用正则“&[a-z0-9]+;”(匹配“&”开头、“;” 的字符),替换成空字符串就行——我之前整理行业报告时,复制了一篇知乎文章,里面有几十个“”,用这个正则3秒就清干净了,比手动删快100倍。
再比如过滤广告,如果你想删掉所有带“点击关注”的句子,可以用正则“.点击关注.”(“.”代表任意字符),替换成空——不过要注意,“.”是“贪婪匹配”,会从第一个“点击关注”匹配到最后一个,所以 用“.?点击关注.?”(非贪婪匹配),这样只会匹配到包含“点击关注”的单句。
场景3:替换文本——批量修改效率翻倍
批量修改文本是正则最“香”的功能。比如把文档里所有的“2023-10-01”改成“2023年10月01日”,对应的正则是“(d{4})-(d{2})-(d{2})”——这里的“()”是“捕获组”,用来保存匹配到的内容:
替换的时候用“$1年$2月$3日”就行——“$1”对应第一个捕获组的内容,“$2”对应第二个,以此类推。我之前帮公司做年会邀请函,要把100个嘉宾的日期格式从“2023-12-25”改成“2023年12月25日”,用这个方法1分钟就搞定了,比手动改快了整整2小时。
给你整理了个“常用正则符号表”,直接存手机备忘录,用的时候翻一下就行:
符号 | 含义 | 例子 | 适用场景 |
---|---|---|---|
d | 匹配任意数字 | d{3} | 提取3位邮编 |
[] | 匹配括号内任意字符 | [a-z] | 匹配小写字母 |
{n} | 匹配前面字符n次 | d{11} | 提取11位手机号 |
.? | 非贪婪匹配任意字符 | “(.?)“ | 提取标签内文本 |
() | 捕获组(保存匹配内容) | (d{4})-(d{2}) | 提取年和月 |
最后说几个“避坑技巧”,帮你少走我当年的弯路
你现在可以打开电脑,找个需要处理的文本——比如微信聊天记录里的手机号,或者文档里的日期格式——用我讲的“1[3-9]d{9}”“(d{4})-(d{2})-(d{2})”试试。要是遇到问题,或者有其他想解决的场景,欢迎在评论区告诉我,我帮你调正则!
我跟你说,正则匹配不到内容的时候,八成是踩了几个“新手必坑”——先讲第一个最常见的:没给特殊字符“转义”。比如你想找带括号的手机号,像“(138)12345678”这种,直接写“(138)”肯定不行啊!括号在正则里是“捕获组”,用来抓内容的,电脑根本不知道你要找实际的括号。我当年第一次帮朋友处理客户电话清单时就栽过这跟头:清单里全是带括号的号码,我直接写“(138)”,结果匹配到的全是文本里其他无关的括号内容,压根没拿到手机号。后来查了资料才明白,得给括号前面加个反斜杠,写成“(138)”——现在我只要看到要匹配的内容里有括号、点、星号这些“特殊符号”,第一反应就是“先加反斜杠再说”。
再说说第二个坑:规则写得太“窄”,漏了实际情况。比如你想匹配手机号,一开始写成“1[3-8]d{9}”,结果发现朋友的199开头的号码没匹配到——这就是规则没跟上实际啊!现在手机号的第二位早扩展到3-9了,得改成“1[3-9]d{9}”才行。还有一次我帮HR朋友提取简历里的身份证号,她写成“d{18}”,结果15位的老身份证号全漏了,后来我把规则改成“d{15}|d{18}”(|是“或者”的意思),才把所有身份证号都抓出来。你看,规则不是越“严”越好,得先想清楚“要找的内容有哪些可能的格式”——比如日期可能是“2023-12-31”“2023/12/31”甚至“2023.12.31”,那规则就得写成“d{4}[-/.]d{2}[-/.]d{2}”([-/.]表示可以是横杠、斜杠或点),这样才不会漏。
还有个超容易忘的点:没开“全局匹配”。比如你想从聊天记录里提取所有快递单号(像“JD1234567890”这种),写了正则“JDd{10}”,结果只拿到第一个单号——这不是正则错了,是正则默认只找“第一个匹配项”!要让它找所有的,得加个“g”(全局模式)。比如在JavaScript里,得写成“/JDd{10}/g”,电脑才会把整个文本里的所有单号都揪出来。我之前帮同事处理客户订单时就犯过这错:一开始只提了第一个单号,还以为是正则写错了,后来加了个“g”,瞬间所有单号都出来了——现在我只要要提取“多个内容”,必加“g”,这是踩过坑才记住的教训。
其实遇到匹配不到的情况,真不用急着乱改正则——先找个在线工具测测就行!比如Regex101,把你要匹配的文本复制进去,再输正则,工具会实时标出来:黄色是匹配到的,白色是没匹配到的。比如你写了个手机号正则,放进去一看199开头的没标黄,就知道是规则写窄了;如果带括号的号码没标黄,就知道是没转义括号。我现在不管写什么正则,都先去测一下——工具能直观告诉你问题在哪,总比自己瞎猜靠谱多了。
正则里的(反斜杠)有什么用?
反斜杠是“转义符”,用来告诉电脑“后面的字符不是特殊符号,要按字面意思匹配”。比如你想找句子里的“.”(比如“www.baidu.com”里的点),直接写“.”会匹配任意字符,加个反斜杠写成“.”,电脑才会认成你要的“点”;再比如想匹配“”本身,得写“\”——简单记:遇到原本有特殊含义的字符(比如.、、?、()),想按字面找就加。
怎么用正则快速验证邮箱格式对不对?
常见邮箱的规律是“用户名@域名.后缀(可能有二级后缀)”,对应的正则可以用:w+@w+.w+(.w+)?
。拆解下:w+
匹配用户名(字母、数字或下划线,比如“zhangsan”);@
是固定的“@”符号;w+.w+
匹配域名+一级后缀(比如“baidu.com”);(.w+)?
里的?
代表“可选”,用来覆盖“com.cn”“net.uk”这种二级后缀。新手用这个正则基本能搞定90%以上的常用邮箱验证。
“贪婪匹配”和“非贪婪匹配”有什么区别?新手该选哪个?
“贪婪匹配”是“尽可能多吃”,比如你用(.)
提取标签内容,原文是“链接1链接2”,它会从第一个吃到最后一个,把“链接1链接2”都拽出来;“非贪婪匹配”是“见好就收”,在.后面加个?变成.
?,它会匹配到第一个就停,刚好提取“链接1”或“链接2”。新手处理“提取某个标签内的内容”“找短文本中的关键词”时,优先用非贪婪匹配(加?),不容易出错。
正则匹配不到内容,可能是哪里错了?
新手常踩的坑有3个:① 没转义特殊字符——比如想匹配“(138)12345678”里的括号,直接写“(”会被当成“捕获组”,得写成“(”和“)”;② 规则写窄了——比如想匹配手机号却写成“1[3-8]d{9}”(漏掉了现在常用的19开头),得改成“1[3-9]d{9}”;③ 没加“全局匹配”——比如文本里有多个手机号,正则后面没加“g”(比如1[3-9]d{9}g
),电脑只会找第一个。遇到问题先别急,用在线工具(比如Regex101)把正则和文本放进去测,工具会标出来哪里没匹配上,比瞎改快得多。