Lobsters | 原文链接 | 2026-09-14 收录

正则能匹配出合法的信用卡号吗?

来源: abstractnonsense.xyz — 2025-08-31

概述

同事问「能不能用正则实现 Luhn 算法来校验信用卡号」,作者被彻底迷住了,于是把这道题拆成形式语言问题。文章先讲卡号结构:前 6 或 8 位是发卡行识别号(IIN),除最后一位外是账户号,最后一位是用 Luhn 算法算出的校验位——支付界面靠它在不发 API 请求的情况下挡住手误,作用类似哈希。Luhn 的常见写法是从右到左交替把数字与它的「Luhn 加倍值」累加,最后判断总和能否被 10 整除;但确定性有限自动机(DFA)无法反向走字符串,作者于是改用按长度奇偶性分支的等价左到右表述,先构造 DFA 再转成正则。两者在形式语言意义下表达力等价,只是 DFA 能把算术状态存进状态与转移里,因此更紧凑。文末列出待办:补 DOT 可视化、用归纳法证明 DFA 正确、证明其最小性,以及一些 Haskell 代码。

核心要点

金句

有时候,一个问题光是存在就已经很危险了。
返回 Lobsters 首页