swift——簡單的正則表達式

最近項目里的有一些輸入文字需要判斷,需求又弄得人比較煩,所以決定用正則寫,關(guān)于swift正則的文章很少,所以就貼出我最近用到的。

代碼如下

// MARK: - String類型的拓展
extension String{
    
    
    /// 身份證正則
    ///
    /// - Returns: true or false
    /// 身份證號的需求給出的是最后一位可以為大寫的X英文字母,但是我發(fā)現(xiàn)即使改變options:的值,也沒有區(qū)分,所以做了一個小寫x返回false的判斷。如果有人知道這個怎么處理,希望能留言給我,謝謝。
    func IsLegalForIDCardNumber()->Bool{
        
        if self.characters.last == "x"{
         
            return false
            
        }
        
        var result = ""
        // - 1、創(chuàng)建規(guī)則
        let pattern1 = "(^[0-9]{15}$)|([0-9]{17}([0-9]|[X])$)"
        //        let pattern1 = "^[a-zA-Z\\u4e00-\\u9fa5][a-zA-Z0-9\\u4e00-\\u9fa5]$"
        // - 2、創(chuàng)建正則表達式對象
        let regex1 = try! NSRegularExpression(pattern: pattern1, options: NSRegularExpression.Options.caseInsensitive)
        // - 3、開始匹配
        let res = regex1.matches(in: self, options: NSRegularExpression.MatchingOptions.init(rawValue: 0), range: NSMakeRange(0, self.characters.count))
        // 輸出結(jié)果
        for checkingRes in res {
            result = result + (self as NSString).substring(with: checkingRes.range)
        }
        if result == self{
            return true
        }else{
            return false
        }
        
    }
    
    /// 銀行卡號正則
    ///
    /// - Returns: true or false
    func IsLegalForBankCardNumber()->Bool{
        
        for char in self.characters{
            if char == "_"{
                return false
            }
        }
        
        var result = ""
        // - 1、創(chuàng)建規(guī)則
        let pattern1 = "[0-9]{15,18}"
        //        let pattern1 = "^[a-zA-Z\\u4e00-\\u9fa5][a-zA-Z0-9\\u4e00-\\u9fa5]$"
        // - 2、創(chuàng)建正則表達式對象
        let regex1 = try! NSRegularExpression(pattern: pattern1, options: NSRegularExpression.Options.caseInsensitive)
        // - 3、開始匹配
        let res = regex1.matches(in: self, options: NSRegularExpression.MatchingOptions(rawValue: 0), range: NSMakeRange(0, self.characters.count))
        // 輸出結(jié)果
        for checkingRes in res {
            result = result + (self as NSString).substring(with: checkingRes.range)
        }
        if result == self{
            return true
        }else{
            return false
        }
        
    }
    
    /// 手機號正則
    ///
    /// - Returns: true or false
    func IsLegalForPhoneNumber()->Bool{
        
        for char in self.characters{
            if char == "_"{
                return false
            }
        }
        
        var result = ""
        // - 1、創(chuàng)建規(guī)則
        let pattern1 = "1[0-9]{10}"
        //        let pattern1 = "^[a-zA-Z\\u4e00-\\u9fa5][a-zA-Z0-9\\u4e00-\\u9fa5]$"
        // - 2、創(chuàng)建正則表達式對象
        let regex1 = try! NSRegularExpression(pattern: pattern1, options: NSRegularExpression.Options.caseInsensitive)
        // - 3、開始匹配
        let res = regex1.matches(in: self, options: NSRegularExpression.MatchingOptions(rawValue: 0), range: NSMakeRange(0, self.characters.count))
        // 輸出結(jié)果
        for checkingRes in res {
            result = result + (self as NSString).substring(with: checkingRes.range)
        }
        if result == self{
            return true
        }else{
            return false
        }
        
    }
}

說一下手機號的正則格式
let pattern1 = "1[0-9]{10}"
雙引號里的1就是第一位必須是1,后續(xù)的[0-9]就是純數(shù)字的意思,{10}就是重復(fù)10次。10次加上第一位必須為1就是11位手機號的判斷。

貼上網(wǎng)上找到的比較好的正則講解

- 幾乎所有的程序設(shè)計語言都支持正則表達式,例如:OC,java,c#,python,js等
- 在很多文本編輯器里,可以使用正則表達式進行檢索,Xcode同樣支持正則表達式!
正則表達式的用處:
1. 判斷給定的字符串是否符合某一種規(guī)則(專門用于操作字符串)
    > 電話號碼,電子郵箱,URL...
    可以直接百度別人寫好的正則
    1>     別人真的寫好了,而且測試過了,我們可以直接用
    2>    要寫出沒有漏洞正則判斷,需要大量的測試,通常最終結(jié)果非常負責

2. 過濾篩選字符串,網(wǎng)絡(luò)爬蟲
3. 替換文字,QQ聊天,圖文混排

0>    匹配
--------------------------------------------------------------------------------
(pattern)        匹配pattern并獲取這一匹配,所獲取的匹配可以從產(chǎn)生的Matches集合得到

1>    集合
--------------------------------------------------------------------------------
[xyz]        字符集合(x/y或z)
[a-z]        字符范圍
[a-zA-Z]
[^xyz]        負值字符集合 (任何字符, 除了xyz)
[^a-z]        負值字符范圍
[a-d][m-p]  并集(a到d 或 m到p)

2>    常用元字符
--------------------------------------------------------------------------------
.            匹配除換行符以外的任意字符
\w            匹配字母或數(shù)字或下劃線或漢字 [a-zA-Z_0-9]
\s            匹配任意的空白符(空格、TAB\t、回車\r \n)
\d            匹配數(shù)字 [0-9]


^            匹配字符串的開始
$            匹配字符串的結(jié)束
\b            匹配單詞的開始或結(jié)束

2>    常用反義符
--------------------------------------------------------------------------------
\W          匹配任意不是字母,數(shù)字,下劃線,漢字的字符[^\w]
\S            匹配任意不是空白符的字符 [^\s]
\D            匹配任意非數(shù)字的字符[^0-9]


\B            匹配不是單詞開頭或結(jié)束的位置
[^x]        匹配除了x以外的任意字符
[^aeiou]    匹配除了aeiou這幾個字母以外的任意字符



4>    常用限定符
--------------------------------------------------------------------------------
*            重復(fù)零次或更多次
+            重復(fù)一次或更多次
?            重復(fù)零次或一次
{n}            重復(fù)n次
{n,}        重復(fù)n次或更多次
{n,m}        重復(fù)n到m次,

5>    貪婪和懶惰
--------------------------------------------------------------------------------
*?            重復(fù)任意次,但盡可能少重復(fù)
*+            重復(fù)1次或更多次,但盡可能少重復(fù)
??            重復(fù)0次或1次,但盡可能少重復(fù)
{n,m}?      重復(fù)n到m次,但盡可能少重復(fù)
{n,}?        重復(fù)n次以上,但盡可能少重復(fù)

有關(guān)正則表達式,如有不對可以留言交流,互勉。

轉(zhuǎn)載請注明出處,謝謝。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容