常用的正則表達(dá)式

常用的表達(dá)式:

enum ReEnum {
    case name(_: String)
    case email(_: String)
    case phoneNum(_: String)
    case idCardNum(_: String)
    case password(_: String)
    case bankCard(_: String)
    case chinese(_: String)
    case nickname(_: String)
    case decimalDigits(_: String) //小數(shù)位數(shù)

    
    var isRight: Bool{
        switch self {
        case let .name(str):
            // 匹配姓名包含字母楼肪、中文字符章郁、空格和特殊字符,長度在2到50個(gè)字符之間
            return NSPredicate(format: "SELF MATCHES %@", "^[a-zA-Z\\u4e00-\\u9fa5\\s\\p{P}]{2,50}$").evaluate(with: str)
        case let .email(str):
            // 驗(yàn)證郵箱
            return NSPredicate(format: "SELF MATCHES %@", "^[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)*(\\.[a-zA-Z]{2,})$").evaluate(with: str)
        case let .phoneNum(str):
            //驗(yàn)證手機(jī)號
            return NSPredicate(format: "SELF MATCHES %@", "^1(3|4|5|6|7|8|9)\\d{9}$").evaluate(with: str)
        case let .idCardNum(str):
            //驗(yàn)證身份證號
            return isTrueIDNumber(text: str)
        case let .password(str):
            //必須包含字母、數(shù)字和特殊字符,不能只包含這些字符的子集,且密碼長度必須在8到16個(gè)字符之間
            return NSPredicate(format: "SELF MATCHES %@", "^(?![a-zA-Z]+$)(?![0-9]+$)(?![~!@#$%^&*()_+|<>,.?/:;']+$)(?![0-9a-zA-Z]+$)|(?![0-9._~!@#$%^&*()_+|<>,.?/:;']+$)|(?![a-zA-Z._~!@#$%^&*()_+|<>,.?/:;']+$)[A-Za-z0-9._~!@#$%^&*()_+|<>,.?/:;'$^&*]{8,16}$").evaluate(with: str)
        case let .bankCard(str):
            //銀行卡號驗(yàn)證
            return checkBankCardNumber(str)
        case let .chinese(str):
            return NSPredicate(format: "SELF MATCHES %@", "^[\\u4e00-\\u9fa5]{0,}$").evaluate(with: str)
        case let .nickname(str):
            // 匹配昵稱包含字母、數(shù)字、下劃線和中文字符茬斧,長度在2到20個(gè)字符之間
            return NSPredicate(format: "SELF MATCHES %@", "^[a-zA-Z0-9_\\u4e00-\\u9fa5]{2,20}$").evaluate(with: str)
        case let .decimalDigits(str):
            //限制輸入兩位小數(shù)
            return NSPredicate(format: "SELF MATCHES %@", "^\\-?([1-9]\\d*|0)(\\.\\d{0,2})?$").evaluate(with: str)
        }
    }
    
    //MARK: -驗(yàn)證銀行卡的有效性
    private func checkBankCardNumber(_ cardNumber: String?) -> Bool {
        var oddSum: Int = 0 // 奇數(shù)和
        var evenSum: Int = 0 // 偶數(shù)和
        var allSum: Int = 0 // 總和
        // 循環(huán)加和
        for i in 1...(cardNumber?.count ?? 0) {
            let theNumber = (cardNumber as NSString?)?.substring(with: NSRange(location: (cardNumber?.count ?? 0) - i, length: 1))
            var lastNumber = Int(theNumber ?? "") ?? 0
            if i % 2 == 0 {
                // 偶數(shù)位
                lastNumber *= 2
                if lastNumber > 9 {
                    lastNumber -= 9
                }
                evenSum += lastNumber
            } else {
                // 奇數(shù)位
                oddSum += lastNumber
            }
        }
        allSum = oddSum + evenSum
        // 是否合法
        if allSum % 10 == 0 {
            return true
        } else {
            return false
        }
    }
    
    //MARK: -驗(yàn)證身份證號碼的有效性
    private func isTrueIDNumber(text:String) -> Bool{
        var value = text
        value = value.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)
        var length : Int = 0
        length = value.count
        if length != 15 && length != 18{
            //不滿足15位和18位,即身份證錯(cuò)誤
            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"]
        // 檢測省份身份行政區(qū)代碼
        let index = value.index(value.startIndex, offsetBy: 1)
        let valueStart2 = String(value[...index])
        //標(biāo)識省份代碼是否正確
        var areaFlag = false
        for areaCode in areasArray {
            if areaCode == valueStart2 {
                areaFlag = true
                break
            }
        }
        if !areaFlag {
            return false
        }
        var regularExpression : NSRegularExpression?
        var numberofMatch : Int?
        var year = 0
        switch length {
        case 15:
            //獲取年份對應(yīng)的數(shù)字
            let valueNSStr = value as NSString
            let yearStr = valueNSStr.substring(with: NSRange.init(location: 6, length: 2)) as NSString
            year = yearStr.integerValue + 1900
            if year % 4 == 0 || (year % 100 == 0 && year % 4 == 0) {
                //創(chuàng)建正則表達(dá)式 NSRegularExpressionCaseInsensitive:不區(qū)分字母大小寫的模式
                //測試出生日期的合法性
                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 NSString
            let yearStr = valueNSStr.substring(with: NSRange.init(location: 6, length: 4)) as NSString
            year = yearStr.integerValue
            if 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))
            if numberofMatch! > 0 {
                let a = getStringByRangeIntValue(Str: valueNSStr, location: 0, length: 1) * 7
                let b = getStringByRangeIntValue(Str: valueNSStr, location: 10, length: 1) * 7
                let c = getStringByRangeIntValue(Str: valueNSStr, location: 1, length: 1) * 9
                let d = getStringByRangeIntValue(Str: valueNSStr, location: 11, length: 1) * 9
                let e = getStringByRangeIntValue(Str: valueNSStr, location: 2, length: 1) * 10
                let f = getStringByRangeIntValue(Str: valueNSStr, location: 12, length: 1) * 10
                let g = getStringByRangeIntValue(Str: valueNSStr, location: 3, length: 1) * 5
                let h = getStringByRangeIntValue(Str: valueNSStr, location: 13, length: 1) * 5
                let i = getStringByRangeIntValue(Str: valueNSStr, location: 4, length: 1) * 8
                let j = getStringByRangeIntValue(Str: valueNSStr, location: 14, length: 1) * 8
                let k = getStringByRangeIntValue(Str: valueNSStr, location: 5, length: 1) * 4
                let l = getStringByRangeIntValue(Str: valueNSStr, location: 15, length: 1) * 4
                let m = getStringByRangeIntValue(Str: valueNSStr, location: 6, length: 1) * 2
                let n = getStringByRangeIntValue(Str: valueNSStr, location: 16, length: 1) * 2
                let o = getStringByRangeIntValue(Str: valueNSStr, location: 7, length: 1) * 1
                let p = getStringByRangeIntValue(Str: valueNSStr, location: 8, length: 1) * 6
                let q = getStringByRangeIntValue(Str: valueNSStr, location: 9, length: 1) * 3
                let S = a + b + c + d + e + f + g + h + i + j + k + l + m + n + o + p + q
                let Y = S % 11
                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
        }
    }
    
    private func getStringByRangeIntValue(Str : NSString,location : Int, length : Int) -> Int{
        let a = Str.substring(with: NSRange(location: location, length: length))
        let intValue = (a as NSString).integerValue
        return intValue
    }
}

僅供參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末梗逮,一起剝皮案震驚了整個(gè)濱河市项秉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌库糠,老刑警劉巖伙狐,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異瞬欧,居然都是意外死亡贷屎,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門艘虎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來唉侄,“玉大人,你說我怎么就攤上這事野建∈艋” “怎么了恬叹?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長同眯。 經(jīng)常有香客問我绽昼,道長,這世上最難降的妖魔是什么须蜗? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任硅确,我火速辦了婚禮,結(jié)果婚禮上明肮,老公的妹妹穿的比我還像新娘菱农。我一直安慰自己,他們只是感情好柿估,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布循未。 她就那樣靜靜地躺著,像睡著了一般秫舌。 火紅的嫁衣襯著肌膚如雪的妖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天舅巷,我揣著相機(jī)與錄音羔味,去河邊找鬼河咽。 笑死钠右,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的忘蟹。 我是一名探鬼主播飒房,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼媚值!你這毒婦竟也來了狠毯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤褥芒,失蹤者是張志新(化名)和其女友劉穎嚼松,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體锰扶,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡献酗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了坷牛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片罕偎。...
    茶點(diǎn)故事閱讀 39,902評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖京闰,靈堂內(nèi)的尸體忽然破棺而出颜及,到底是詐尸還是另有隱情甩苛,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布俏站,位于F島的核電站讯蒲,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏肄扎。R本人自食惡果不足惜爱葵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望反浓。 院中可真熱鬧萌丈,春花似錦、人聲如沸雷则。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽月劈。三九已至度迂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間猜揪,已是汗流浹背惭墓。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留而姐,地道東北人腊凶。 一個(gè)月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像拴念,于是被迫代替她去往敵國和親钧萍。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容