swift 自定義正則表達(dá)式運(yùn)算符 =~

swift 至今并沒有在語(yǔ)言層面上支持正則表達(dá)式,可能在開發(fā)app時(shí)正則表達(dá)式使用的場(chǎng)景并不多。

封裝

在 Cocoa 中我們可以使用 NSRegularExpression 來(lái)做正則匹配,所以我們?cè)?NSRegularExpression 的基礎(chǔ)上封裝一個(gè) RegularExpHelper 配匹一個(gè)字符串是否符合某個(gè)正則表達(dá)式。

struct RegularExpHelper {
    let RegularExp: NSRegularExpression
    
    init(_ pattern: String) throws {
        try RegularExp = NSRegularExpression(pattern: pattern, options: .caseInsensitive)
    }
    
    func match(inpuut: String) -> Bool {
        let matches = RegularExp.matches(in: inpuut, options: [], range: NSMakeRange(0, inpuut.count))
        return matches.count > 0
    }
}

自定義 =~

有了封裝好的 RegularExpHelper,我們就可以方便的自定義運(yùn)算符了。

infix operator =~ : ATPrecedence
precedencegroup ATPrecedence {
    associativity: none
    higherThan: AdditionPrecedence
    lowerThan: MultiplicationPrecedence
}

func =~ (input: String, RegularExp: String) -> Bool {
    do {
        return try RegularExpHelper(RegularExp).match(inpuut: input)
    } catch _ {
        return false
    }
}

運(yùn)算符定義

  • infix 表示定義一個(gè)中位操作符(前后都是輸入)
  • prefix 表示定義一個(gè)前位操作符(前是輸入)
  • postfix 表示定義一個(gè)后位操作符(后是輸入)

associativity 結(jié)合律

即多個(gè)同類的操作符順序出現(xiàn)時(shí)的計(jì)算順序

  • left (從左往右的順序)
  • right(從右往左的順序)
  • none(默認(rèn)就為 none,不會(huì)再結(jié)合)

優(yōu)先級(jí)

  • higherThan 優(yōu)先級(jí)高于 AdditionPrecedence 這個(gè)是加法的類型
  • lowerThan 優(yōu)先級(jí)低于 MultiplicationPrecedence 乘除

然后我們就可以使用了

    if "88888888@qq.com" =~ "^([a-z0-9_\\.-]+)@([\\da-z\\.-]+)\\.([a-z\\.]{2,6})$" {
        print("符合郵箱規(guī)則")
    } else {
        print("不符合郵箱規(guī)則")
    }

注意

  • 使用正則表達(dá)式字符串時(shí)注意轉(zhuǎn)義字符的使用。
  • swift 的操作符是不能定義在局部域中的,因?yàn)椴僮鞣切枰谌址秶鷥?nèi)使用的。
  • 重載和自定義操作符存在很多風(fēng)險(xiǎn),使用前請(qǐng)多問問自己是否真的需要這么做!
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,160評(píng)論 25 708
  • 初衷:看了很多視頻、文章,最后卻通通忘記了,別人的知識(shí)依舊是別人的,自己卻什么都沒獲得。此系列文章旨在加深自己的印...
    DCbryant閱讀 4,259評(píng)論 0 20
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,628評(píng)論 19 139
  • 既是隔了三河兩岸 也無(wú)親近之想 從耳邊吹過 總帶過一陣陣風(fēng) 吹的什么風(fēng) 誰(shuí)怎么能明白
    C鑫琪閱讀 396評(píng)論 1 1
  • 效果圖: 看網(wǎng)上的都是兩個(gè)view拼接,默認(rèn)右側(cè)的不顯示,水平移動(dòng)的時(shí)候把右側(cè)的view顯示出來(lái)。但是看最新版QQ...
    solary2016閱讀 2,409評(píng)論 0 25

友情鏈接更多精彩內(nèi)容