亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Regex > 正文

swift中的正則表達式小結

2020-03-16 21:03:45
字體:
來源:轉載
供稿:網友

正則表達式是對字符串操作的一種邏輯公式,用事先定義好的一些特定字符、及這些特定字符的組合,組成一個"規則字符串",這個"規則字符串"用來表達對字符串的一種過濾邏輯。

作為一門先進的編程語言,Swift 可以說吸收了眾多其他先進語言的優點,但是有一點卻是讓人略微失望的,就是 Swift 至今為止并沒有在語言層面上支持正則表達式。

正則表達式的用處:

判斷給定的字符串是否符合某一種規則(專門用于操作字符串)

- 電話號碼,電子郵箱,URL...

- 可以直接百度別人寫好的正則

- 別人真的寫好了,而且測試過了,我們可以直接用

- 要寫出沒有漏洞正則判斷,需要大量的測試,通常最終結果非常負責

過濾篩選字符串,網絡爬蟲

替換文字,QQ聊天,圖文混排

語法規則

swift中的正則表達式小結

swift中的正則表達式小結

使用過程

1、創建規則

2、創建正則表達式對象

3、開始匹配

代碼示例

 

 
  1. private func check(str: String) { 
  2. // 使用正則表達式一定要加try語句 
  3. do { 
  4. // - 1、創建規則 
  5. let pattern = "[1-9][0-9]{4,14}" 
  6. // - 2、創建正則表達式對象 
  7. let regex = try NSRegularExpression(pattern: pattern, options: NSRegularExpressionOptions.CaseInsensitive) 
  8. // - 3、開始匹配 
  9. let res = regex.matchesInString(str, options: NSMatchingOptions(rawValue: 0), range: NSMakeRange(0, str.characters.count)) 
  10. // 輸出結果 
  11. for checkingRes in res { 
  12. print((str as NSString).substringWithRange(checkingRes.range)) 
  13. catch { 
  14. print(error) 

其他幾個常用方法

 

 
  1. // 匹配字符串中所有的符合規則的字符串, 返回匹配到的NSTextCheckingResult數組 
  2. public func matchesInString(string: String, options: NSMatchingOptions, range: NSRange) -> [NSTextCheckingResult]  
  3. // 按照規則匹配字符串, 返回匹配到的個數 
  4. public func numberOfMatchesInString(string: String, options: NSMatchingOptions, range: NSRange) -> Int 
  5.  
  6. // 按照規則匹配字符串, 返回第一個匹配到的字符串的NSTextCheckingResult 
  7. public func firstMatchInString(string: String, options: NSMatchingOptions, range: NSRange) -> NSTextCheckingResult? 
  8.  
  9. // 按照規則匹配字符串, 返回第一個匹配到的字符串的范圍 
  10. public func rangeOfFirstMatchInString(string: String, options: NSMatchingOptions, range: NSRange) -> NSRange 

使用子類來匹配日期、地址、和URL

看官網文檔解釋,可以知道這個 NSDataDetector 主要用來匹配日期、地址、和URL。在使用時指定要匹配的類型

 

 
  1. public class NSDataDetector : NSRegularExpression { 
  2. // all instance variables are private 
  3. /* NSDataDetector is a specialized subclass of NSRegularExpression. Instead of finding matches to regular expression patterns, it matches items identified by Data Detectors, such as dates, addresses, and URLs. The checkingTypes argument should contain one or more of the types NSTextCheckingTypeDate, NSTextCheckingTypeAddress, NSTextCheckingTypeLink, NSTextCheckingTypePhoneNumber, and NSTextCheckingTypeTransitInformation. The NSTextCheckingResult instances returned will be of the appropriate types from that list. 
  4. */ 
  5. public init(types checkingTypes: NSTextCheckingTypes) throws 
  6. public var checkingTypes: NSTextCheckingTypes { get } 
  7. // 這個是類型選擇 
  8. public static var Date: NSTextCheckingType { get } // date/time detection 
  9. public static var Address: NSTextCheckingType { get } // address detection 
  10. public static var Link: NSTextCheckingType { get } // link detection 

NSDataDetector 獲取URL示例

 

 
  1. /** 
  2. 匹配字符串中的URLS 
  3.  
  4. - parameter str: 要匹配的字符串 
  5. */ 
  6. private func getUrl(str:String) { 
  7. // 創建一個正則表達式對象 
  8. do { 
  9. let dataDetector = try NSDataDetector(types: NSTextCheckingTypes(NSTextCheckingType.Link.rawValue)) 
  10. // 匹配字符串,返回結果集 
  11. let res = dataDetector.matchesInString(str, options: NSMatchingOptions(rawValue: 0), range: NSMakeRange(0, str.characters.count)) 
  12. // 取出結果 
  13. for checkingRes in res { 
  14. print((str as NSString).substringWithRange(checkingRes.range)) 
  15. catch { 
  16. print(error) 

".*?" 可以滿足一些基本的匹配要求

如果想同時匹配多個規則 ,可以通過 "|" 將多個規則連接起來

將字符串中文字替換為表情

 

 
  1. /** 
  2. 顯示字符中的表情 
  3. - parameter str: 匹配字符串 
  4. */ 
  5. private func getEmoji(str:String) { 
  6. let strM = NSMutableAttributedString(string: str) 
  7. do { 
  8. let pattern = "//[.*?//]" 
  9. let regex = try NSRegularExpression(pattern: pattern, options: NSRegularExpressionOptions.CaseInsensitive) 
  10. let res = regex.matchesInString(str, options: NSMatchingOptions(rawValue: 0), range: NSMakeRange(0, str.characters.count)) 
  11. var count = res.count 
  12. // 反向取出文字表情 
  13. while count > 0 { 
  14. let checkingRes = res[--count] 
  15. let tempStr = (str as NSString).substringWithRange(checkingRes.range) 
  16. // 轉換字符串到表情 
  17. if let emoticon = EmoticonPackage.emoticonWithStr(tempStr) { 
  18. print(emoticon.chs) 
  19. let attrStr = EmoticonTextAttachment.imageText(emoticon, font: 18) 
  20. strM.replaceCharactersInRange(checkingRes.range, withAttributedString: attrStr) 
  21. print(strM) 
  22. // 替換字符串,顯示到label 
  23. emoticonLabel.attributedText = strM 
  24. catch { 
  25. print(error) 

TextKit 給URL高亮顯示

主要用到三個類

NSTextStorage

NSLayoutManager

NSTextContainer

自定義UILabel來實現url高亮

1、定義要用到的屬性

 

 
  1. /* 
  2. 只要textStorage中的內容發生變化, 就可以通知layoutManager重新布局 
  3. layoutManager重新布局需要知道繪制到什么地方, 所以layoutManager就會文textContainer繪制的區域 
  4. */ 
  5. // 準們用于存儲內容的 
  6. // textStorage 中有 layoutManager 
  7. private lazy var textStorage = NSTextStorage() 
  8. // 專門用于管理布局 
  9. // layoutManager 中有 textContainer 
  10. private lazy var layoutManager = NSLayoutManager() 
  11. // 專門用于指定繪制的區域 
  12. private lazy var textContainer = NSTextContainer() 
  13. override init(frame: CGRect) { 
  14. super.init(frame: frame) 
  15. setupSystem() 
  16. required init?(coder aDecoder: NSCoder) { 
  17. super.init(coder: aDecoder) 
  18. setupSystem() 
  19. private func setupSystem() 
  20. // 1.將layoutManager添加到textStorage 
  21. textStorage.addLayoutManager(layoutManager) 
  22. // 2.將textContainer添加到layoutManager 
  23. layoutManager.addTextContainer(textContainer) 
  24. override func layoutSubviews() { 
  25. super.layoutSubviews() 
  26. // 3.指定區域 
  27. textContainer.size = bounds.size 

2、重寫label的text屬性

 

 
  1. override var text: String? 
  2. didSet{ 
  3. // 1.修改textStorage存儲的內容 
  4. textStorage.setAttributedString(NSAttributedString(string: text!)) 
  5. // 2.設置textStorage的屬性 
  6. textStorage.addAttribute(NSFontAttributeName, value: UIFont.systemFontOfSize(20), range: NSMakeRange(0, text!.characters.count)) 
  7. // 3.處理URL 
  8. self.URLRegex() 
  9. // 2.通知layoutManager重新布局 
  10. setNeedsDisplay() 

3、匹配字符串

 

 
  1. func URLRegex() 
  2. // 1.創建一個正則表達式對象 
  3. do
  4. let dataDetector = try NSDataDetector(types: NSTextCheckingTypes(NSTextCheckingType.Link.rawValue)) 
  5. let res = dataDetector.matchesInString(textStorage.string, options: NSMatchingOptions(rawValue: 0), range: NSMakeRange(0, textStorage.string.characters.count)) 
  6. // 4取出結果 
  7. for checkingRes in res 
  8. let str = (textStorage.string as NSString).substringWithRange(checkingRes.range) 
  9. let tempStr = NSMutableAttributedString(string: str) 
  10. // tempStr.addAttribute(NSForegroundColorAttributeName, value: UIColor.redColor(), range: NSMakeRange(0, str.characters.count)) 
  11. tempStr.addAttributes([NSFontAttributeName: UIFont.systemFontOfSize(20), NSForegroundColorAttributeName: UIColor.redColor()], range: NSMakeRange(0, str.characters.count)) 
  12. textStorage.replaceCharactersInRange(checkingRes.range, withAttributedString: tempStr) 
  13. }catch 
  14. print(error) 

4、重繪文字

 

 
  1. // 如果是UILabel調用setNeedsDisplay方法, 系統會促發drawTextInRect 
  2. override func drawTextInRect(rect: CGRect) { 
  3. // 重繪 
  4. // 字形 : 理解為一個小的UIView 
  5. /* 
  6. 第一個參數: 指定繪制的范圍 
  7. 第二個參數: 指定從什么位置開始繪制 
  8. */ 
  9. layoutManager.drawGlyphsForGlyphRange(NSMakeRange(0, text!.characters.count), atPoint: CGPointZero) 

獲取label中URL的點擊

如果要獲取URL的點擊,那么必須獲取點擊的范圍

 

 
  1. override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
  2. // 1、獲取手指點擊的位置 
  3. let touch = (touches as NSSet).anyObject()! 
  4. let point = touch.locationInView(touch.view) 
  5. print(point) 
  6. // 2、獲取URL區域 
  7. // 注意: 沒有辦法直接設置UITextRange的范圍 
  8. let range = NSMakeRange(10, 20) 
  9. // 只要設置selectedRange, 那么就相當于設置了selectedTextRange 
  10. selectedRange = range 
  11. // 給定指定的range, 返回range對應的字符串的rect 
  12. // 返回數組的原因是因為文字可能換行 
  13. let array = selectionRectsForRange(selectedTextRange!) 
  14. for selectionRect in array { 
  15. if CGRectContainsPoint(selectionRect.rect, point) { 
  16. print("點擊了URL"

以上內容就是小編跟大家介紹的swift中的正則表達式小結,希望大家喜歡。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品永久免费| 欧美在线视频一区二区| 国产综合视频在线观看| 亚洲美女在线视频| 欧美亚洲在线播放| 九色成人免费视频| 九九热在线精品视频| zzjj国产精品一区二区| 日韩av在线直播| 中文字幕久久久av一区| 欧美精品videos| 日韩综合视频在线观看| 日韩欧美亚洲综合| 欧美猛交ⅹxxx乱大交视频| 欧美日韩精品在线观看| 91精品久久久久久久久久久| 国产精品流白浆视频| 亚洲系列中文字幕| 亚洲欧美一区二区精品久久久| 久久高清视频免费| 色999日韩欧美国产| 91精品视频播放| 亚洲美女精品久久| 欧美日韩国产精品专区| 亚洲精品在线观看www| 91国产视频在线播放| 人人爽久久涩噜噜噜网站| 亚洲护士老师的毛茸茸最新章节| 一区二区三区久久精品| 欧美一级电影久久| 俺去亚洲欧洲欧美日韩| 欧美日韩亚洲激情| 欧美大肥婆大肥bbbbb| 91欧美激情另类亚洲| 国产999在线观看| 亚洲成人动漫在线播放| 国产在线视频2019最新视频| 俺去亚洲欧洲欧美日韩| 亚洲午夜精品视频| 精品五月天久久| 欧美寡妇偷汉性猛交| 懂色av影视一区二区三区| 国产精品99导航| 欧美激情精品久久久久久久变态| 亚洲人成77777在线观看网| 韩剧1988免费观看全集| 狠狠操狠狠色综合网| 欧美日韩国产影院| 日韩免费中文字幕| 日韩久久午夜影院| 久久久久久美女| 日本成人在线视频网址| 一本久久综合亚洲鲁鲁| 日本久久亚洲电影| 疯狂欧美牲乱大交777| 精品久久久免费| 96pao国产成视频永久免费| 色综合天天狠天天透天天伊人| 91久久久亚洲精品| 欧美性在线观看| 91麻豆国产语对白在线观看| 一本久久综合亚洲鲁鲁| 欧美大片大片在线播放| 高跟丝袜一区二区三区| 午夜精品一区二区三区在线播放| 91色琪琪电影亚洲精品久久| 久久久久久久久综合| 欧美性生交xxxxx久久久| 97视频在线观看免费| 日韩av在线天堂网| 国产成人精品久久二区二区91| 91久久精品日日躁夜夜躁国产| 一本大道香蕉久在线播放29| 高跟丝袜一区二区三区| 成人午夜激情免费视频| 国产精品福利无圣光在线一区| 国产婷婷色综合av蜜臀av| 亚洲自拍欧美另类| 91网站在线免费观看| 亚洲欧美日韩精品| 懂色aⅴ精品一区二区三区蜜月| 57pao成人永久免费视频| 欧美日韩免费区域视频在线观看| 亚洲精品动漫久久久久| 91精品在线影院| 在线观看久久久久久| 97香蕉久久超级碰碰高清版| 久久精品91久久久久久再现| 97久久精品人人澡人人爽缅北| 久久精品2019中文字幕| 久久久视频免费观看| 日韩在线观看免费网站| 91久久国产精品91久久性色| 国产精品爽爽爽| xxx一区二区| 一区二区三区国产视频| 亚洲精品白浆高清久久久久久| 欧美成人午夜剧场免费观看| 精品小视频在线| 日本中文字幕成人| 国产精品视频久久久久| 国产精品欧美激情| 亚洲成年网站在线观看| 亚洲精品999| 欧美性理论片在线观看片免费| 欧美精品www在线观看| 国产精品青草久久久久福利99| 久久久人成影片一区二区三区| 亚洲色图综合久久| 久久久久久久久久久91| 精品久久久久久久中文字幕| 热99精品只有里视频精品| 黑人巨大精品欧美一区二区一视频| 26uuu另类亚洲欧美日本老年| 91超碰中文字幕久久精品| 亚洲四色影视在线观看| 最新国产精品拍自在线播放| 亚洲精品美女在线| 欧美性感美女h网站在线观看免费| 日韩av一区二区在线观看| 亚洲国产日韩欧美在线动漫| 国产精品海角社区在线观看| 亚洲国产又黄又爽女人高潮的| 久久综合久中文字幕青草| 中文字幕国产亚洲2019| 国产精品嫩草影院久久久| 日韩精品丝袜在线| 国产成人一区二区三区小说| 日本久久精品视频| 欧美成人精品影院| 国产精品久久久久久久9999| 日韩中文字幕在线观看| 97在线视频免费| 超碰精品一区二区三区乱码| 韩国三级电影久久久久久| 亚洲色在线视频| 国产精品久久久久久久久久ktv| 国产精品aaa| 亚洲午夜未满十八勿入免费观看全集| 国产精品精品视频一区二区三区| 国产精品日韩专区| 国产香蕉精品视频一区二区三区| 欧美日韩综合视频网址| 日韩av手机在线观看| 国产精品久久久久久久久久| 91色p视频在线| 一区二区三区视频免费在线观看| 自拍偷拍亚洲在线| 欧美日韩国产一区在线| 国产精品第二页| 国产综合在线视频| 国产精品中文久久久久久久| 亚洲精品资源美女情侣酒店| 一本一本久久a久久精品综合小说| 国产精品久久久999| 国产91亚洲精品| 91国产视频在线播放| 青青在线视频一区二区三区| 欧美影院久久久| 欧美性少妇18aaaa视频| 久久99久久99精品中文字幕| 一区二区三区www| 俺去亚洲欧洲欧美日韩| 欧美第一页在线|