正则表达式菜鸟教程
正则表达式这玩意儿,正则第一眼看上去就像键盘上猫踩出来的表达乱码。但别被吓跑,式菜它本质上就是鸟教一套“字符串匹配”的规则。你给它一个模式,正则它就在一大段文本里帮你找符合这个模式的表达内容。就这么简单。式菜
举个我昨天刚碰上的鸟教例子。我手头有个几百行的正则日志文件,要找所有格式为“2024-03-15 14:23:45”的表达时间戳。手动翻?式菜眼得瞎。用正则,鸟教一行代码搞定:\d{ 4}-\d{ 2}-\d{ 2} \d{ 2}:\d{ 2}:\d{ 2}。正则这里\d代表数字,表达{ 4}表示重复四次。式菜你看,规则清楚得跟写纸条似的。
新手最容易卡在“元字符”上。.匹配任意单个字符,*表示前一个字符出现零次或多次,+是至少一次。这些符号就像是乐高积木的接口,学会了拼装,你就能搭出各种形状。^表示行首,$表示行尾。比如^cat只匹配行首的“cat”,cat$只匹配行尾的。别急着背,用多了自然就记住了。
真正让正则强大的是“字符类”。方括号[ ]里放一组字符,表示匹配其中任意一个。[a-z]匹配所有小写字母,[0-9]就是数字。你甚至可以取反,[^0-9]匹配任何非数字字符。有一次我要清洗一批用户手机号,把那些混着横线、空格、括号的脏数据全挑出来,就靠[^0-9]定位到每一个非数字位置,再手动处理。
分组和捕获是进阶玩法。用圆括号( )把一部分模式包起来,之后可以用\1引用它。比如你想找重复的单词,“the the”这种,写(\b\w+)\s+\1就能命中。\b是单词边界,防止匹配到“the theory”里的“the the”部分。这个功能在代码重构时特别有用,批量替换时能精准抓住目标。
懒惰匹配和贪婪匹配是个坑。默认情况下,.*是贪婪的,会尽可能多地匹配字符。比如在HTML里想抓<div>...</div>,你写<div>.*</div>,它会从第一个<div>一直吃到最后一个</div>,中间所有内容全吞进去。这时候你得用懒惰量词.*?,它会匹配到第一个</div>就停。这个坑我踩过不止一次,每次都是调试半天才反应过来。
不同的编程语言正则语法略有差异,但核心概念一致。JavaScript里用/pattern/字面量,Python里用re模块的re.search()或re.findall()。别指望一套正则代码到处跑通,比如Python支持(?P<name>...)命名分组,而JavaScript直到ES2018才支持类似功能。跨语言时查一下文档,别硬套。
写正则别追求一步到位。先写个粗糙的版本,测几个用例,再逐步收紧。我习惯在regex101.com这类在线工具上调试,它能实时高亮匹配结果,还能解释每个部分的含义。等模式稳定了,再贴回代码里。
最后说句实话——这玩意儿学起来容易,用起来难。难在你得先想清楚“我要找的东西长什么样”,再用正则语言描述出来。就像学外语,词汇和语法都背熟了,开口说还是得练。多拿几段真实文本练手吧,日志、HTML、CSV,什么都行。用着用着,你就发现那些乱码开始变得顺眼了。
(责任编辑:综合)














