正則表達(dá)式是我們經(jīng)常要用到的方法,今天我們通過(guò)一種簡(jiǎn)單的自定義操作符來(lái)重新認(rèn)識(shí)下正則表達(dá)式的最優(yōu)寫法:
precedencegroup?MatchPrecedence {
?associativity:?none
?higherThan: DefaultPrecedence
}
infixoperator?=~ : MatchPrecedence
/// 正則表達(dá)式判斷
///
/// -?Parameters:
///? - lhs: 左邊的參數(shù)歧蕉,內(nèi)容
///? - rhs: 右邊的參數(shù),規(guī)則
/// -?Returns: 如果符合返回true脓鹃,否則返回false
func=~(lhs:String, rhs:MMRegExKey) ->Bool{
?do{
?return?try?RegexHelper(rhs.rawValue).match(lhs)
}catch_{
?return?false
? ? }
}
struct?RegexHelper {
? ? let regex: NSRegularExpression
? ? init(_pattern:String)?throws{
? ? ? ? try?regex=NSRegularExpression(pattern: pattern,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? options: .caseInsensitive)
? ? }
? ? func?match(_input:String) ->Bool{
? ? ? ? let?matches =regex.matches(in: input,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? options: [],
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? range:NSMakeRange(0, input.utf16.count))
? ? ? ? return?matches.count>0
? ? }
}
struct MMRegExKey: RawRepresentable {
? ? typealias?RawValue =String
? ? var?rawValue:String
? ? static?let?phoneNumber = MMRegExKey(rawValue:"^(1[3-9])\\d{9}$")
? ? static?let?telephone = MMRegExKey(rawValue:"^[0-9]{8}$")
? ? static?let?smsCode = MMRegExKey(rawValue:"^[0-9]{6}$")
? ? static?let?paymentCode = MMRegExKey(rawValue:"^[0-9]{6}$")
? ? static?let?password = MMRegExKey(rawValue:"^[0-9A-Za-z]{6,20}$")
}
使用:
extension String {
? ? /// 檢查手機(jī)號(hào)碼格式
? ? ///
? ? /// - Throws: 錯(cuò)誤原因
? ? func?checkPhoneNumber()?throws{
? ? ? ??guard?!self.isEmpty?else{
? ? ? ? ? ? throw?NSError(localizedDescription:"請(qǐng)輸入手機(jī)號(hào)碼")
? ? ? ? }
? ? ? ? guard?self?=~ .phoneNumber?else{
? ? ? ? ? ? throw?NSError(localizedDescription:"手機(jī)號(hào)碼輸入有誤")
? ? ? ? }
? ? }
}