组织机构代码校验需分两步:先用正则^[A-HJ-NP-Z0-9]{8}-[0-9X]$粗筛格式(排除I/O、支持大小写转换),再用加权模11算法验证第10位校验码(权重[3,7,9,10,5,8,4,2],余10为X)。

组织机构代码的校验规则必须先搞清楚
组织机构代码是10位固定格式:前8位是数字或大写字母(不含IO),第9位是连字符-,第10位是校验码(数字或X)。它不是纯数字,不能用^\d{10}$这种简单正则应付。
真正有效的校验分两步:先用正则粗筛格式,再用算法验证第10位校验码。网上很多只写个^[A-Z0-9]{8}-[0-9X]$的正则,漏掉了字母禁用规则(I/O)、大小写混用风险、以及最关键的校验码逻辑,实际会放过错误码。
前端用 pattern 属性只能做格式初筛
HTML5 的 pattern 只支持基础正则,无法执行校验码计算,所以它只能拦住明显错的格式,比如少位数、含小写字母、用了非法字符等。
推荐的 pattern 值:
立即学习“前端免费学习笔记(深入)”;
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
<input type="text" pattern="[A-HJ-NP-Z0-9]{8}-[0-9X]" title="请输入正确的组织机构代码(8位字母数字+‘-’+1位校验码)">-
[A-HJ-NP-Z0-9]明确排除 I 和 O(易与 1、0 混淆) - 不加
^$——pattern默认全匹配,加了反而可能失效 - 不校验大小写:浏览器输入法不可控,建议用
input事件转大写,而不是依赖正则强制
必须用 JavaScript 补全校验码逻辑
第10位校验码是按前8位加权模11算出来的,权重固定为 [3,7,9,10,5,8,4,2],结果为 10 时用 X 表示。只靠正则永远绕不开这一步。
实操建议直接封装一个校验函数:
function validateOrgCode(code) {
const reg = /^([A-HJ-NP-Z0-9]{8})-([0-9X])$/;
const m = code.match(reg);
if (!m) return false;
const [_, body, check] = m;
const weights = [3,7,9,10,5,8,4,2];
let sum = 0;
for (let i = 0; i < 8; i++) {
const c = body[i];
const n = isNaN(c) ? c.charCodeAt(0) - 55 : parseInt(c, 10); // A=10, B=11...
sum += n * weights[i];
}
const expected = (11 - sum % 11) % 11;
const actual = check === 'X' ? 10 : parseInt(check, 10);
return expected === actual;
}- 注意字母转数值:A→10、B→11……Z→35,但组织机构代码中只用到 A–H、J–N、P–Z,所以
charCodeAt(0) - 55是安全的 - 别忘了
(11 - sum % 11) % 11这个兜底——当sum % 11 === 0时,校验码应为 0 - 这个函数必须在
blur或submit时调用,不能只信pattern
后端绝对不能省掉重复校验
前端任何校验都可被绕过。只要接口接收组织机构代码,后端必须用相同算法再算一遍,且建议额外查国家企业信用信息公示系统 API(如有权限)或本地缓存库做存在性验证。
常见疏漏点:
- 后端用正则代替算法,比如只校验长度和字符集,放行了
12345678-0这种明显错误的码 - 没处理大小写:前端转了大写,后端却用小写参与计算,导致校验失败
- 把
X当普通字符比对,没统一转成 10 再参与模运算
校验码算法本身不复杂,但每个环节的类型转换、边界值、字母映射稍有偏差就会出错。宁可多写几行,也不要图省事拼正则。


















