Swift - 正則相關(guān)分類

  • 正則運算符定義
  • 喵神提供的一段定義正則運算符(超級好用!!!),使用范例
if "onev@onevcat.com" =~
 "^([a-z0-9_\\.-]+)@([\\da-z\\.-]+)\\.([a-z\\.]{2,6})$" {
 println("有效的郵箱地址")
}
// 輸出:
// 有效的郵箱地址
  • 實現(xiàn)代碼
struct RegexHelper {
    let regex: NSRegularExpression
    
    init(_ pattern: String) throws {
        try regex = NSRegularExpression(pattern: pattern,
                                        options: .CaseInsensitive)
    }
        func match(inputStr: String) -> Bool {
        let matches = regex.matchesInString(inputStr,
                                            options: [],
                                            range: NSMakeRange(0, inputStr.utf16.count))
        return matches.count > 0
    }
}

infix operator =~ {
associativity none
precedence 130
}

func =~(lhs: String, rhs: String) -> Bool {
    do {
        return try RegexHelper(rhs).match(lhs)
    } catch _ {
        return false
    }
}
  • 下面是一些對String類的擴(kuò)展(正則相關(guān))
  • 返回所有匹配到的字串集合,返回例如: [str1,str2,str3]
/**
 返回所有匹配到的字串集合
 - parameter pattern:  正則匹配規(guī)則
 - parameter inputStr: 要匹配的文本
 - returns:匹配到的字串集合
 */
func bl_regexWithPattern(pattern : String,
                         inputStr: String) -> [String] {
    // 使用正則表達(dá)式一定要加try語句
    do {
        // - 1粮宛、創(chuàng)建規(guī)則
        let pattern = pattern
        // - 2梧兼、創(chuàng)建正則表達(dá)式對象
        let regex = try NSRegularExpression(pattern: pattern, options: NSRegularExpressionOptions.CaseInsensitive)
        // - 3正压、開始匹配
        let res = regex.matchesInString(inputStr, options: NSMatchingOptions(rawValue: 0), range: NSMakeRange(0, inputStr.characters.count))
        // 輸出結(jié)果
        var subStrArray = [String]()
        for checkingRes in res {
            let subStr = (inputStr as NSString).substringWithRange(checkingRes.range)
            subStrArray.append(subStr)
        }
        return subStrArray
    }
    catch {
        print(error)
    }
    //不匹配返回空串
    return [String]()
}
  • 返回一個字典 key : 匹配到的字串, Value : 匹配到的字串
  • 返回例如 : [ keyStr : [NSRange] ]
/// 返回一個字典  key : 匹配到的字串, Value : 匹配到的字串的Range數(shù)組
func bl_regexWithPatternAndRange(pattern : String,inputStr: String) -> [[String : [NSRange]]]? {
    let strArray = bl_regexWithPattern(pattern, inputStr: inputStr)
    
    var array = [[String : [NSRange]]]()
    for subStr in strArray {
        var dic = [String : [NSRange]]()
        let subStrRangeArray = bl_stringOfRangeArray(subStr, inputStr: inputStr)
        dic[subStr] = subStrRangeArray
        array.append(dic)
    }
    return array
}


/// 返回一個數(shù)組 Value : 匹配到的字串的Range數(shù)組
func bl_stringOfRangeArray(subStr : String, inputStr : String) -> [NSRange]? {
    
    guard inputStr =~ subStr else{
        return [NSMakeRange(0, 0)]
    }
    
    //設(shè)置Range數(shù)組
    var rangeArray = [NSRange]()
    
    //設(shè)置母串
    var bigString = inputStr
    // - 1馋贤、創(chuàng)建規(guī)則
    let pattern = subStr
    
    var count : Int = 0
    
    
    do{
        let regex = try NSRegularExpression(pattern: pattern, options: NSRegularExpressionOptions.CaseInsensitive)
        //獲取子串個數(shù)
        count = regex.numberOfMatchesInString(bigString, options: .ReportProgress, range: NSMakeRange(0, bigString.characters.count))
        
    }catch{
        print(error)
    }
    
    
    for i in 0..<count {
        
        var subRange = (bigString as NSString).rangeOfString(pattern)
        
        let cutLoc = subRange.location + subRange.length
        let cutLen = bigString.characters.count - cutLoc
        
        bigString = (bigString as NSString).substringWithRange(NSMakeRange(cutLoc, cutLen))
        
        if i > 0 {
            let preSubRange = rangeArray[i - 1]
            subRange.location = preSubRange.location + preSubRange.length
        }
        rangeArray.append(subRange)
    }
    
    return rangeArray
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市滤馍,隨后出現(xiàn)的幾起案子岛琼,更是在濱河造成了極大的恐慌,老刑警劉巖巢株,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件槐瑞,死亡現(xiàn)場離奇詭異,居然都是意外死亡阁苞,警方通過查閱死者的電腦和手機(jī)困檩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來那槽,“玉大人悼沿,你說我怎么就攤上這事【氤矗” “怎么了显沈?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長逢唤。 經(jīng)常有香客問我,道長涤浇,這世上最難降的妖魔是什么鳖藕? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮只锭,結(jié)果婚禮上著恩,老公的妹妹穿的比我還像新娘。我一直安慰自己蜻展,他們只是感情好喉誊,可當(dāng)我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著纵顾,像睡著了一般伍茄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上施逾,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天敷矫,我揣著相機(jī)與錄音例获,去河邊找鬼。 笑死曹仗,一個胖子當(dāng)著我的面吹牛榨汤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播怎茫,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼收壕,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了轨蛤?” 一聲冷哼從身側(cè)響起蜜宪,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎俱萍,沒想到半個月后端壳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡枪蘑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年损谦,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片岳颇。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡照捡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出话侧,到底是詐尸還是另有隱情栗精,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布瞻鹏,位于F島的核電站悲立,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏新博。R本人自食惡果不足惜薪夕,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赫悄。 院中可真熱鬧原献,春花似錦、人聲如沸埂淮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽倔撞。三九已至讲仰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間误窖,已是汗流浹背叮盘。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工秩贰, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人柔吼。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓毒费,卻偏偏與公主長得像,于是被迫代替她去往敵國和親愈魏。 傳聞我的和親對象是個殘疾皇子觅玻,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,901評論 2 355

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