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)多問問自己是否真的需要這么做!