You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改社保号码正则以适配不支持前瞻断言的Awk?

解决方案

可以通过正向匹配所有合法组合替代前瞻断言,写出Awk支持的POSIX扩展正则表达式,完全符合你的社保号码校验规则。

正则拆解(对应规则)

  1. 前三位(排除000、666、900-999):
    拆分合法范围为三类:

    • 001-099:0(0[1-9]|[1-9][0-9])
    • 100-599、700-899:[1-57-8][0-9]{2}
    • 600-659、670-699(排除666):6([0-57-9][0-9]|6[0-57-9])
      合并后:(0(0[1-9]|[1-9][0-9])|[1-57-8][0-9]{2}|6([0-57-9][0-9]|6[0-57-9]))
  2. 中间两位(01-99):直接匹配非00的两位数字:(0[1-9]|[1-9][0-9])

  3. 最后四位(0001-9999):匹配非0000的四位数字:(000[1-9]|00[1-9][0-9]|0[1-9][0-9]{2}|[1-9][0-9]{3})

  4. 横杠可选:保留原逻辑,用-?允许每个位置的横杠存在或缺失。

修改后的Awk代码

#!/usr/bin/awk -f

BEGIN {
    FPAT = "([^,]*)|(\"[^\"]*\")";
}
{
    for(i=1; i<=NF; i++) {
        if(match($i, /^(0(0[1-9]|[1-9][0-9])|[1-57-8][0-9]{2}|6([0-57-9][0-9]|6[0-57-9]))-?(0[1-9]|[1-9][0-9])-?(000[1-9]|00[1-9][0-9]|0[1-9][0-9]{2}|[1-9][0-9]{3})$/) {
            print $i;
        }
    }
}

END {print "DONE"}

这个正则完全遵循你设定的校验规则,且不需要依赖前瞻断言,能在Awk中正常运行。

内容的提问来源于stack exchange,提问作者fuusei

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 18:15:58