凌晨一点半,我盯着屏幕上那一行正则,已经看了二十分钟。它本来应该把日志里的时间戳揪出来,结果现在把整段文字都吞了,匹配到一个长达八百字符的怪物字符串。我知道问题出在哪儿——那个贪婪的 .* 又犯病了。可我盯着它,越看越像天书。

这就是写正则的诡异之处。你写下它的那一刻觉得自己是个天才,半小时后就沦为它的人质。

一

我做后端这些年,正则算是用得最勤、也最怕的工具之一。它短小,锋利,一行能顶别人三十行循环。可它也是我见过最傲慢的代码——你以为你驯服了它,其实它随时准备在某个边界条件上给你一记闷棍。

去年有个线上 bug,就是某个邮箱校验正则把带加号的地址全拦了,用户投诉了一整周才发现。那行正则我写过,review 过,还挺得意它的简洁。结果简洁的背后,是三个我压根没想到的例外。

从那以后,我对正则的态度从“炫技”变成了“敬畏”。能用字符串函数解决的,绝不硬上正则。

二

今晚这个不一样。它是个一次性脚本,处理一批历史日志,用完就扔,我懒,就没写测试,直接莽。第一版能跑,第二版我想加个分组,手一滑,括号没配对,整个语义全歪了。

我试了 non-greedy,试了加锚点,试了把 .* 换成更具体的字符类。每改一次,满怀希望地点运行,然后看着输出里那个越来越长的匹配,心里凉一截。

ide 里的语法高亮把那行正则染成五颜六色,像一条缠在一起的节日灯串,我站在底下,不知道该从哪头解。

三

最后我是用笨办法解决的。把需求拆成三步,先粗筛,再细分,每一步只用最简单的一个模式。丑是丑了点,但跑了三遍数据,结果稳。

收拾键盘的时候我想,写代码这件事,越往后越明白一个道理:优雅是奢侈品,可靠才是日用品。年轻时爱写那种让人拍案的句子,现在更愿意写笨一点、丑一点、但三个月后我自己还能一眼看懂的东西。

正则还是那行正则,只是我不再指望它替我聪明了。

窗外天快亮了。我存了档,没提交,打算明天清醒了再 review 一遍。有些代码,留到白天再看,会比深夜仁慈。