swift 自定義正規表示式運算子 =~

Inlight發表於2017-12-21

swift 至今並沒有在語言層面上支援正規表示式,可能在開發app時正規表示式使用的場景並不多。

封裝

在 Cocoa 中我們可以使用 NSRegularExpression 來做正則匹配,所以我們在 NSRegularExpression 的基礎上封裝一個 RegularExpHelper 配匹一個字串是否符合某個正規表示式。

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,我們就可以方便的自定義運算子了。

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
    }
}
複製程式碼

運算子定義

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

associativity 結合律

即多個同類的操作符順序出現時的計算順序

  • left (從左往右的順序)
  • right(從右往左的順序)
  • none(預設就為 none,不會再結合)

優先順序

  • higherThan 優先順序高於 AdditionPrecedence 這個是加法的型別
  • lowerThan 優先順序低於 MultiplicationPrecedence 乘除

然後我們就可以使用了

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

注意

  • 使用正規表示式字串時注意轉義字元的使用。
  • swift 的操作符是不能定義在區域性域中的,因為操作符是需要在全域性範圍內使用的。
  • 過載和自定義操作符存在很多風險,使用前請多問問自己是否真的需要這麼做!

相關文章