身份证常识
我国的身份证号分为15位和18位两种。身份证是国民的身份编号,编号是有一定规律的。
居民身份证号码,根据〖中华人民共和国国家标准 GB 11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。 居民身份证是国家法定的证明公民个人身份的有效证件。
结构和形式
1号码的结构公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。2.地址码表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。3.出生日期码表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。4.顺序码表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。5.校验码根据前面十七位数字码,按照ISO7064:1983.MOD11-2校验码计算出来的检验码。6.地址码华北地区: 北京市|110000,天津市|120000,河北省|130000,山西省|140000,内蒙古自治区|150000,
东北地区: 辽宁省|210000,吉林省|220000,黑龙江省|230000,
华东地区: 上海市|310000,江苏省|320000,浙江省|330000,安徽省|340000,福建省|350000,江西省|360000,山东省|370000,
华中地区: 河南省|410000,湖北省|420000,湖南省|430000
华南地区: 广东省|440000,广西壮族自治区|450000,海南省|460000,
西南地区: 重庆市|500000,四川省|510000,贵州省|520000,云南省|530000,西藏自治区|540000,
西北地区: 陕西省|610000,甘肃省|620000,青海省|630000,宁夏回族自治区|640000,新疆维吾尔自治区|650000,
特别地区:台湾地区(886)|710000,香港特别行政区(852)|810000,澳门特别行政区(853)|820000中国大陆居民身份证号码中的地址码的数字编码规则为:第一、二位表示省(自治区、直辖市、特别行政区)。第三、四位表示市(地级市、自治州、盟及国家直辖市所属市辖区和县的汇总码)。其中,01-20,51-70表示省直辖市;21-50表示地区(自治州、盟)。第五、六位表示县(市辖区、县级市、旗)。01-18表示市辖区或地区(自治州、盟)辖县级市;21-80表示县(旗);81-99表示省直辖县级市。7.生日期码身份证号码第七位到第十四位)表示编码对象出生的年、月、日,其中年份用四位数字表示,年、月、日之间不用分隔符。例如:1981年05月11日就用19810511表示。8.顺序码身份证号码第十五位到十七位)地址码所标识的区域范围内,对同年、月、日出生的人员编定的顺序号。其中第十七位奇数分给男性,偶数分给女性9.校验码作为尾号的校验码,是由号码编制单位按统一的公式计算出来的,如果某人的尾号是0-9,都不会出现X,但如果尾号是10,那么就得用X来代替,因为如果用10做尾号,那么此人的身份证就变成了19位,而19位的号码违反了国家标准,并且中国的计算机应用系统也不承认19位的身份证号码。Ⅹ是罗马数字的10,用X来代替10,可以保证公民的身份证符合国家标准。10.身份证校验码的计算方法1、将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。
2、将这17位数字和系数相乘的结果相加。
3、用加出来和除以11,看余数是多少?
4、余数只可能有0-1-2-3-4-5-6-7-8-9-10这11个数字。其分别对应的最后一位身份证的号码为1-0-X-9-8-7-6-5-4-3-2。(即余数0对应1,余数1对应0,余数2对应X...)
5、通过上面得知如果余数是3,就会在身份证的第18位数字上出现的是9。如果对应的数字是2,身份证的最后一位号码就是罗马数字x。
/**常用正则表达式,身份证、电话号码、邮箱、银行卡号*/
import UIKit
/**这个枚举验证邮箱、手机号使用:Validate.email("abc@@qq.com").isRight //falseValidate.URL("https://www.baidu.com").isRight //trueValidate.IP("192.168.0.1").isRight //true*/
enum Validate {case email(_: String)case phoneNum(_: String)case carNum(_: String)case username(_: String)case password(_: String)case nickname(_: String)case URL(_: String)case IP(_: String)var isRight: Bool {var predicateStr:String!var currObject:String!switch self {case let .email(str):predicateStr = "^([a-z0-9_\\.-]+)@([\\da-z\\.-]+)\\.([a-z\\.]{2,6})$"currObject = strcase let .phoneNum(str):predicateStr = "^((13[0-9])|(15[^4,\\D]) |(17[0,0-9])|(18[0,0-9]))\\d{8}$"currObject = strcase let .carNum(str):predicateStr = "^[A-Za-z]{1}[A-Za-z_0-9]{5}$"currObject = strcase let .username(str):predicateStr = "^[A-Za-z0-9]{6,20}+$"currObject = strcase let .password(str):predicateStr = "^[a-zA-Z0-9]{6,20}+$"currObject = strcase let .nickname(str):predicateStr = "^[\\u4e00-\\u9fa5]{4,8}$"currObject = strcase let .URL(str):predicateStr = "^(https?:\\/\\/)?([\\da-z\\.-]+)\\.([a-z\\.]{2,6})([\\/\\w \\.-]*)*\\/?$"currObject = strcase let .IP(str):predicateStr = "^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$"currObject = str}let predicate =  NSPredicate(format: "SELF MATCHES %@" ,predicateStr)return predicate.evaluate(with: currObject)}
}
class LYBZhengzeExtention: NSObject {}
extension NSString {//身份证校验方法一func checkIsIdentityCard(_ identityCard: String) -> Bool {//判断是否为空if identityCard.count <= 0 {return false}//判断是否是18位,末尾是否是xlet regex2: String = "^(\\d{14}|\\d{17})(\\d|[xX])$"let identityCardPredicate = NSPredicate(format: "SELF MATCHES %@", regex2)if !identityCardPredicate.evaluate(with: identityCard) {return false}//判断生日是否合法let range = NSRange(location: 6, length: 8)let datestr: String = (identityCard as NSString).substring(with: range)let formatter = DateFormatter()formatter.dateFormat = "yyyyMMdd"if formatter.date(from: datestr) == nil {return false}//判断校验位if  identityCard.count == 18 {let idCardWi: [String] = ["7", "9", "10", "5", "8", "4", "2", "1", "6", "3", "7", "9", "10", "5", "8", "4", "2"]//将前17位加权因子保存在数组里let idCardY: [String] = ["1", "0", "10", "9", "8", "7", "6", "5", "4", "3", "2"]//这是除以11后,可能产生的11位余数、验证码,也保存成数组var idCardWiSum: Int = 0//用来保存前17位各自乖以加权因子后的总和for i in 0..<17 {idCardWiSum += Int((identityCard as NSString).substring(with: NSRange(location: i, length: 1)))! * Int(idCardWi[i])!}let idCardMod: Int = idCardWiSum % 11//计算出校验码所在数组的位置
//            let idCardLast: String = identityCard.substring(from: identityCard.index(identityCard.endIndex, offsetBy: -1))let idCardLast: String = String(identityCard.suffix(1))//截取最后一个字符串//得到最后一位身份证号码//如果等于2,则说明校验码是10,身份证号码最后一位应该是Xif idCardMod == 2 {if idCardLast == "X" || idCardLast == "x" {return true} else {return false}} else {//用计算出的验证码与最后一位身份证号码匹配,如果一致,说明通过,否则是无效的身份证号码if (idCardLast as NSString).integerValue == Int(idCardY[idCardMod]) {return true} else {return false}}}return false}/***///身份证校验方法二func isTrueIDNumber(text:String) -> Bool{var value = textvalue = value.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)var length : Int = 0length = value.countif length != 15 && length != 18{//不满足15位和18位,即身份证错误return false}// 省份代码let areasArray = ["11","12", "13","14", "15","21", "22","23", "31","32", "33","34", "35","36", "37","41", "42","43", "44","45", "46","50", "51","52", "53","54", "61","62", "63","64", "65","71", "81","82", "91"]// 检测省份身份行政区代码let index = value.index(value.startIndex, offsetBy: 2)
//        let valueStart2 = value.substring(to: index)let valueStart2 =   value[value.startIndex..<index]//标识省份代码是否正确var areaFlag = falsefor areaCode in areasArray {if areaCode == valueStart2 {areaFlag = truebreak}}if !areaFlag {return false}var regularExpression : NSRegularExpression?var numberofMatch : Int?var year = 0switch length {case 15://获取年份对应的数字let valueNSStr = value as NSStringlet yearStr = valueNSStr.substring(with: NSRange.init(location: 6, length: 2)) as NSStringyear = yearStr.integerValue + 1900if year % 4 == 0 || (year % 100 == 0 && year % 4 == 0) {//创建正则表达式 NSRegularExpressionCaseInsensitive:不区分字母大小写的模式//测试出生日期的合法性regularExpression = try! NSRegularExpression.init(pattern: "^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$", options: NSRegularExpression.Options.caseInsensitive)}else{//测试出生日期的合法性regularExpression = try! NSRegularExpression.init(pattern: "^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$", options: NSRegularExpression.Options.caseInsensitive)}numberofMatch = regularExpression?.numberOfMatches(in: value, options: NSRegularExpression.MatchingOptions.reportProgress, range: NSRange.init(location: 0, length: value.count))if numberofMatch! > 0 {return true}else{return false}case 18:let valueNSStr = value as NSStringlet yearStr = valueNSStr.substring(with: NSRange.init(location: 6, length: 4)) as NSStringyear = yearStr.integerValueif year % 4 == 0 || (year % 100 == 0 && year % 4 == 0) {//测试出生日期的合法性regularExpression = try! NSRegularExpression.init(pattern: "^((1[1-5])|(2[1-3])|(3[1-7])|(4[1-6])|(5[0-4])|(6[1-5])|71|(8[12])|91)\\d{4}(((19|20)\\d{2}(0[13-9]|1[012])(0[1-9]|[12]\\d|30))|((19|20)\\d{2}(0[13578]|1[02])31)|((19|20)\\d{2}02(0[1-9]|1\\d|2[0-8]))|((19|20)([13579][26]|[2468][048]|0[048])0229))\\d{3}(\\d|X|x)?$", options: NSRegularExpression.Options.caseInsensitive)}else{//测试出生日期的合法性regularExpression = try! NSRegularExpression.init(pattern: "^((1[1-5])|(2[1-3])|(3[1-7])|(4[1-6])|(5[0-4])|(6[1-5])|71|(8[12])|91)\\d{4}(((19|20)\\d{2}(0[13-9]|1[012])(0[1-9]|[12]\\d|30))|((19|20)\\d{2}(0[13578]|1[02])31)|((19|20)\\d{2}02(0[1-9]|1\\d|2[0-8]))|((19|20)([13579][26]|[2468][048]|0[048])0229))\\d{3}(\\d|X|x)?$", options: NSRegularExpression.Options.caseInsensitive)}numberofMatch = regularExpression?.numberOfMatches(in: value, options: NSRegularExpression.MatchingOptions.reportProgress, range: NSRange.init(location: 0, length: value.count))print("numberofMatch=========\(String(describing: numberofMatch))")if numberofMatch! > 0 {let a = getStringByRangeIntValue(Str: valueNSStr, location: 0, length: 1) * 7let b = getStringByRangeIntValue(Str: valueNSStr, location: 10, length: 1) * 7let c = getStringByRangeIntValue(Str: valueNSStr, location: 1, length: 1) * 9let d = getStringByRangeIntValue(Str: valueNSStr, location: 11, length: 1) * 9let e = getStringByRangeIntValue(Str: valueNSStr, location: 2, length: 1) * 10let f = getStringByRangeIntValue(Str: valueNSStr, location: 12, length: 1) * 10let g = getStringByRangeIntValue(Str: valueNSStr, location: 3, length: 1) * 5let h = getStringByRangeIntValue(Str: valueNSStr, location: 13, length: 1) * 5let i = getStringByRangeIntValue(Str: valueNSStr, location: 4, length: 1) * 8let j = getStringByRangeIntValue(Str: valueNSStr, location: 14, length: 1) * 8let k = getStringByRangeIntValue(Str: valueNSStr, location: 5, length: 1) * 4let l = getStringByRangeIntValue(Str: valueNSStr, location: 15, length: 1) * 4let m = getStringByRangeIntValue(Str: valueNSStr, location: 6, length: 1) * 2let n = getStringByRangeIntValue(Str: valueNSStr, location: 16, length: 1) * 2let o = getStringByRangeIntValue(Str: valueNSStr, location: 7, length: 1) * 1let p = getStringByRangeIntValue(Str: valueNSStr, location: 8, length: 1) * 6let q = getStringByRangeIntValue(Str: valueNSStr, location: 9, length: 1) * 3let S = a + b + c + d + e + f + g + h + i + j + k + l + m + n + o + p + qprint("S============\(S)")let Y = S % 11print("Y========\(Y)")var M = "F"let JYM = "10X98765432"M = (JYM as NSString).substring(with: NSRange.init(location: Y, length: 1))let lastStr = valueNSStr.substring(with: NSRange.init(location: 17, length: 1))if lastStr == "x" {if M == "X" {return true}else{return false}}else{if M == lastStr {return true}else{return false}}}else{return false}default:return false}}func getStringByRangeIntValue(Str : NSString,location : Int, length : Int) -> Int{let a = Str.substring(with: NSRange(location: location, length: length))let intValue = (a as NSString).integerValuereturn intValue}/**电话号码*/func isTelNumber(num:NSString)->Bool{let mobile = "^1((3[0-9]|4[57]|5[0-35-9]|7[0678]|8[0-9])\\d{8}$)"let  CM = "(^1(3[4-9]|4[7]|5[0-27-9]|7[8]|8[2-478])\\d{8}$)|(^1705\\d{7}$)";let  CU = "(^1(3[0-2]|4[5]|5[56]|7[6]|8[56])\\d{8}$)|(^1709\\d{7}$)";let  CT = "(^1(33|53|77|8[019])\\d{8}$)|(^1700\\d{7}$)";let regextestmobile = NSPredicate(format: "SELF MATCHES %@",mobile)let regextestcm = NSPredicate(format: "SELF MATCHES %@",CM )let regextestcu = NSPredicate(format: "SELF MATCHES %@" ,CU)let regextestct = NSPredicate(format: "SELF MATCHES %@" ,CT)if ((regextestmobile.evaluate(with: num) == true)|| (regextestcm.evaluate(with: num)  == true)|| (regextestct.evaluate(with: num) == true)|| (regextestcu.evaluate(with: num) == true)){return true}else{return false}}/**银行卡正则*//**邮箱正则*/func isNumber() -> Bool {let pattern = "^[0-9]+$"if NSPredicate(format: "SELF MATCHES %@", pattern).evaluate(with: self) {return true}return false
}// 验证是不是字母func isLetter() -> Bool {let pattern = "^^[A-Za-z0-9]+$"if NSPredicate(format: "SELF MATCHES %@", pattern).evaluate(with: self) {return true}return false}//MARK: - 验证是否是6位纯数字func isNumberSix() -> Bool {
let pattern = "^\\d{6}$"if NSPredicate(format: "SELF MATCHES %@", pattern).evaluate(with: self) {return true}return false}//MARK: - 验证是否是是有效提现金额func verifyNumberTwo() -> Bool {let pattern = "^\\d+(\\.\\d{1,2})?$"if NSPredicate(format: "SELF MATCHES %@", pattern).evaluate(with: self) {return true}return false}//检测银行卡func verifyBankCard(bankNum:String) -> Bool {let pattern = "^([0-9]{16}|[0-9]{19}|[0-9]{17}|[0-9]{18}|[0-9]{20}|[0-9]{21})$"let regex = try! NSRegularExpression(pattern: pattern, options: NSRegularExpression.Options.dotMatchesLineSeparators)if let _ = regex.firstMatch(in: bankNum, options: NSRegularExpression.MatchingOptions(rawValue: 0), range: NSMakeRange(0, bankNum.count)) {return true}return false}//检测姓名func verifyUserName(nameStr:String) -> Bool {let pattern = "(^[\u{4e00}-\u{9fa5}]{2,12}$)|(^[A-Za-z0-9_-]{4,12}$)"let regex = try! NSRegularExpression(pattern: pattern, options: NSRegularExpression.Options.dotMatchesLineSeparators)if let _ = regex.firstMatch(in: nameStr, options: NSRegularExpression.MatchingOptions(rawValue: 0), range: NSMakeRange(0, nameStr.count)) {return true}return false}}

iOS/swift之常用正则相关推荐

  1. JS中常用正则转换和信息验证的封装(80个)

    JS中常用正则转换和信息验证的封装(80个) 邮箱 手机号码 电话号码 是否url地址 是否字符串 是否数字 是否boolean 是否函数 是否为null 是否undefined 是否对象 是否数组 ...

  2. iOS tableview的常用delegate和dataSource执行顺序

    在这次项目中遇到了一个特别奇葩的问题:表视图创建的cell在7以上的系统能正常运行显示,在模拟器上就不能正常实现......为解决这个问题,纠结了好久...... 对在7系统上不显示的猜测: 用mas ...

  3. IOS代码实现常用控件UIButton、UISlider、UISwitch、UISegmentedControl

    IOS中最常用到的控件UIButton.UISlider.UISwitch.UISegmentedControl通过Xib文件拖动生成非常简单,其实用代码实现也是一样的简单,当然,用代码实现能够掌握到 ...

  4. 正则式简介及常用正则式

    好像很多公司招程序员都会考正则式,故搜了些东西与大家共享 (在此向原作者致敬!) 刚准备学,自己也不懂.下面的一篇文章讲的是PHP语言的正则式,好像各语言略有不同,有个讲java正则式的ppt,下面给 ...

  5. .Net常用正则判断方法

    .Net常用正则判断方法 原文:.Net常用正则判断方法 /// <summary>/// 判断string类型否为数字/// </summary>/// <param ...

  6. IOS swift项目的单例模式.swift5以后的单例模式

    IOS swift项目的单例模式.swift5以后的单例模式 不能继承NSObject 第一种写法,最简单 class SoundTools{static let sharedInstance = S ...

  7. iOS开发API常用英语名词

    iOS开发API常用英语名词 0. indicating 决定 1.in order to 以便 2.rectangle bounds 矩形尺寸 3.applied 应用 4.entirety 全部 ...

  8. IOS学习:常用第三方库(GDataXMLNode:xml解析库)

    IOS学习:常用第三方库(GDataXMLNode:xml解析库) 解析 XML 通常有两种方式,DOM 和 SAX: DOM解析XML时,读入整个XML文档并构建一个驻留内存的树结构(节点树),通过 ...

  9. 正则基本知识和常用正则

    @预定义类和转义符 .      [^\n\r]         除了换行和回车之外的任意字符 \d    [0-9]           数字字符digit \D   [^0-9]          ...

最新文章

  1. Toad 修改起始窗口
  2. 一文讲懂图像处理中的低通、高通、带阻和带通滤波器
  3. Sqlserver数据库类型介绍,可作为参考书
  4. Python的可视化包 – Matplotlib 2D图表(点图和线图,.柱状或饼状类型的图),3D图表(曲面图,散点图和柱状图)...
  5. Sublime Text 3 快捷键精华版
  6. TensorFlow基于cifar10数据集实现进阶的卷积网络
  7. Mysql从库主键卡住_从库宕机引发的主键冲突
  8. nhibernate many-to-one 没有匹配项时的异常
  9. 结对编程,到底是双剑合璧还是脚趾抠地?
  10. poj 3080 Blue Jeans【字符串】
  11. 远程复制无法读取源文件或磁盘
  12. 计算机专业同学综合自我评估,计算机专业学生个人自我评价
  13. kotlin expecting a top leveleclaration
  14. Frenet坐标系与Cartesian坐标系互转(二):Python代码函数实现
  15. JESD204B SUBCLASS1确定性延时参数的计算
  16. 【融职培训】Web前端学习 第11章 微信开发4 JS-SDK接口
  17. 迅雷7 down.php,迅雷云点播放器(KCPlayer5000)
  18. 深入解析车牌识别相机在互联网+加油站中的应用方案
  19. 计算机机原理是什么意思,计算机工作原理及与工控机的区别
  20. 节点重要度 matlab,复杂网络节点重要度常用指标及其计算

热门文章

  1. 小学生算术能力测试系统(改进)
  2. 外贸:这个圣诞节你想好怎么选品了吗
  3. C++制作汉字版国际象棋(2)
  4. EFI引导win8 + ubuntu双系统
  5. Matlab的Gpu加速(CUDA cudnn)
  6. 风机效率计算的python代码
  7. 循环while和for语句
  8. php画图抗锯齿,GD绘图抗锯齿方案[PHP]
  9. 一班洽谈框架细化_理解层次:框架细化篇(以供参悟)
  10. 漫画:程序员的吐槽会