swift 自定义正则表达式运算符 =~

作者: Inlight先森 | 来源:发表于2017-12-20 11:27 被阅读235次

    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 的操作符是不能定义在局部域中的,因为操作符是需要在全局范围内使用的。
    • 重载和自定义操作符存在很多风险,使用前请多问问自己是否真的需要这么做!

    相关文章

      网友评论

        本文标题:swift 自定义正则表达式运算符 =~

        本文链接:https://www.haomeiwen.com/subject/eafgwxtx.html