分享这篇文章
继续阅读
正则表达式 (Regular Expression, RegEx) 适合做文本匹配、提取和简单校验。它可以把一段规则压缩成很短的表达式,比如邮箱格式检查:/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/。问题也在这里:表达式越短,越容易让下一位维护者看不懂。
如果需求只是检查“至少包含一个大写字母、一个数字和一个特殊符号”,正则可以减少很多手写循环:
^(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$
这类表达式适合放在表单校验、日志过滤、文本提取和快速搜索里。只要规则还能用一句话说清,正则通常能处理。
嵌套量词可能触发灾难性回溯 (Catastrophic Backtracking)。例如 (a+)+ 在遇到特定长字符串时,会让引擎反复尝试大量组合。用户可控输入如果触发这种路径,Node.js 服务或浏览器页面都可能卡住,这类问题被称为 ReDoS。
处理用户输入时,避免无边界的嵌套贪婪量词。能写明确字符类就不要写过宽的 .*,能限制长度就限制长度。
生产环境中的正则表达式应该能被下一位维护者读懂。遇到复杂规则时,优先使用命名常量、旁注说明和多个小检查,而不是把所有逻辑压成一行。比如密码规则既可以用一个很长的表达式完成,也可以拆成多条清晰的校验消息,后者往往更容易维护。
锚点要有意识地使用。^ 和 $ 表示整段字符串必须匹配,通常适合表单验证。如果缺少锚点,一个危险输入可能因为局部片段匹配而被放行。域名中的点需要转义,通配符不宜滥用;如果产品支持国际化姓名、地址或内容,也要测试 Unicode 场景。
正则问题常藏在边界里:空字符串、超长字符串、异常空白、emoji、换行、多语种混排,以及恶意构造的重复输入。做提取时,要检查多次匹配和分组结果;做验证时,建议保留两组样例:必须通过和必须失败。进入代码评审前,两组样例都应该跑过。
性能也需要关注。用户可控输入不要使用嵌套贪婪量词,尽量选择有边界的范围、明确的字符类和更简单的分支。如果某个表达式会在每次请求中运行,或者用于扫描大量日志,就应该用最坏情况输入做基准测试,而不是只看正常样例。
ToolOrbit 的相关流程包括:用 AI 正则生成器 起草表达式,用 正则测试器 验证行为,再用 文本对比 检查规则变更。AI 生成的表达式应视为建议,最终仍要用真实约束测试。