如何修改社保号码正则以适配不支持前瞻断言的Awk?
解决方案
可以通过正向匹配所有合法组合替代前瞻断言,写出Awk支持的POSIX扩展正则表达式,完全符合你的社保号码校验规则。
正则拆解(对应规则)
前三位(排除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]))
- 001-099:
中间两位(01-99):直接匹配非00的两位数字:
(0[1-9]|[1-9][0-9])最后四位(0001-9999):匹配非0000的四位数字:
(000[1-9]|00[1-9][0-9]|0[1-9][0-9]{2}|[1-9][0-9]{3})横杠可选:保留原逻辑,用
-?允许每个位置的横杠存在或缺失。
修改后的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
相关产品推荐
相关产品推荐

