github.com/isyscore/isc-gobase@v1.5.3-0.20231218061332-cbc7451899e9/validate/matcher/idCardValidate.go (about) 1 package matcher 2 3 import ( 4 "regexp" 5 "strconv" 6 ) 7 8 var idCardSize = 17 9 10 // 加权因子 11 var weightFactor = [17]int{7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2} 12 13 // 校验码 14 var checkCode = [11]string{"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"} 15 16 // 第一位不可能是0 17 // 第二位到第六位可以是0-9 18 // 第七位到第十位是年份,所以七八位为19或者20 19 // 十一位和十二位是月份,这两位是01-12之间的数值 20 // 十三位和十四位是日期,是从01-31之间的数值 21 // 十五,十六,十七都是数字0-9 22 // 十八位可能是数字0-9,也可能是X 23 var idCardPatter = "^[1-9][0-9]{5}([1][9][0-9]{2}|[2][0][0|1][0-9])([0][1-9]|[1][0|1|2])([0][1-9]|[1|2][0-9]|[3][0|1])[0-9]{3}([0-9]|[X])$" 24 25 func idCardIsValidate(idCard string) bool { 26 if idCard == "" { 27 return false 28 } 29 30 if len(idCard) < idCardSize { 31 return false 32 } 33 34 seventeen := idCard[:idCardSize] 35 36 num := 0 37 for index, data := range seventeen { 38 r, _ := strconv.Atoi(string(data)) 39 num += r * weightFactor[index] 40 } 41 42 if idCard[len(idCard)-1:] != checkCode[num%11] { 43 return false 44 } 45 46 result, _ := regexp.MatchString(idCardPatter, idCard) 47 return result 48 }