正则表达式让我哭到崩溃,直到我发现了这个测试工具
我多年来坚信正则表达式是虐待狂系统管理员发明的惩罚手段。然后一个简单的测试工具改变了一切。
我记得正则表达式击垮我的确切时刻。我 25 岁,盯着一个应该用来验证邮箱地址的模式。它大约 50 个字符长,看起来像一只猫踩过我的键盘:
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$
我从 Stack Overflow 上复制的。它对大多数邮箱有效。但出于某种原因,它拒绝了 "o'brien@irishmail.ie"。我花了两个小时试图修复它。我加反斜杠。我删反斜杠。我加分組。我质疑我的职业选择。我没修好。我对着显示器哭了一小会儿。
那天正则表达式赢了。
正则表达式到底是什么?
对于未入门的人来说——如果你在这个阵营里,祝福你——正则表达式(regular expression 的简称)是一种描述文本中模式的方式。想在一万字的文档中找到每个电话号码?用正则。想检查一个字符串看起来是否像有效日期?用正则。想在同事围观时感觉自己像在解码古代符文?绝对要用正则。
问题在于,正则看起来像线路噪音,直到你突然开窍。而且它毫不留情。一个放错位置的反斜杠就能把你的模式从"匹配所有东西"变成"匹配不了任何东西,而且还会崩溃。"
测试工具如何拯救了我
我正跟一个朋友抱怨我的邮箱正则问题,她非常随意地说:"哦,用个测试工具就行了。它实时显示模式的每个部分在做什么。"
我打开我们的 regex tester,把坏掉的正则粘贴进去,输入了一个测试字符串。一目了然。工具用不同颜色高亮显示了模式的每个部分,精确地显示了哪些字符匹配哪些分组,并且——最关键的是——指出我的 [a-zA-Z0-9._%+-] 字符类没有包含撇号。当然没有。我是个白痴。
但工具没骂我白痴。它只是温柔地向我展示了真相,用彩色代码的方式。我加了撇号。邮箱通过了。我感觉我刚做了脑部手术。
我现在能做到的事
如今我也不是正则大师。我仍然每次都要查如何做前瞻断言。但我可以自信地写出电话号码、邮政编码和基本数据验证的模式。而且每个我都会在生产环境使用之前测试。
关键洞察:正则不是通过读书学会的。它是通过实践学会的——观察什么匹配、什么不匹配、以及不断迭代。测试工具让这个反馈循环即时发生。没有它,你就是在盲飞。
如果你,像过去的我一样,被糟糕的正则体验伤害过——再给它一次机会。打开 regex tester,输入一些简单的东西比如 hello,看它亮起来。然后加个点。再加个星号。突然你就成了巫师。而这一次,你不会哭了。