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

首頁 > 編程 > regex > 正文

swift中的正則表達式小結

2020-01-20 22:09:36
字體:
來源:轉載
供稿:網友

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

正則表達式的用處:

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

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

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

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

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

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

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

語法規則

使用過程

1、創建規則
2、創建正則表達式對象
3、開始匹配

代碼示例

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

其他幾個常用方法        

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

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

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

public class NSDataDetector : NSRegularExpression { // all instance variables are private /* 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. */ public init(types checkingTypes: NSTextCheckingTypes) throws public var checkingTypes: NSTextCheckingTypes { get }}// 這個是類型選擇 public static var Date: NSTextCheckingType { get } // date/time detection public static var Address: NSTextCheckingType { get } // address detection public static var Link: NSTextCheckingType { get } // link detection

NSDataDetector 獲取URL示例

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

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

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

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

 /**顯示字符中的表情- parameter str: 匹配字符串*/private func getEmoji(str:String) { let strM = NSMutableAttributedString(string: str) do {  let pattern = "http://[.*?//]"  let regex = try NSRegularExpression(pattern: pattern, options: NSRegularExpressionOptions.CaseInsensitive)  let res = regex.matchesInString(str, options: NSMatchingOptions(rawValue: 0), range: NSMakeRange(0, str.characters.count))  var count = res.count  // 反向取出文字表情  while count > 0 {   let checkingRes = res[--count]   let tempStr = (str as NSString).substringWithRange(checkingRes.range)   // 轉換字符串到表情   if let emoticon = EmoticonPackage.emoticonWithStr(tempStr) {    print(emoticon.chs)    let attrStr = EmoticonTextAttachment.imageText(emoticon, font: 18)    strM.replaceCharactersInRange(checkingRes.range, withAttributedString: attrStr)   }  }  print(strM)  // 替換字符串,顯示到label  emoticonLabel.attributedText = strM } catch {  print(error) }}

TextKit 給URL高亮顯示

主要用到三個類

NSTextStorage
NSLayoutManager
NSTextContainer

自定義UILabel來實現url高亮

1、定義要用到的屬性

 /* 只要textStorage中的內容發生變化, 就可以通知layoutManager重新布局 layoutManager重新布局需要知道繪制到什么地方, 所以layoutManager就會文textContainer繪制的區域 */ // 準們用于存儲內容的 // textStorage 中有 layoutManager private lazy var textStorage = NSTextStorage() // 專門用于管理布局 // layoutManager 中有 textContainer private lazy var layoutManager = NSLayoutManager() // 專門用于指定繪制的區域 private lazy var textContainer = NSTextContainer() override init(frame: CGRect) {   super.init(frame: frame)   setupSystem() } required init?(coder aDecoder: NSCoder) {   super.init(coder: aDecoder)   setupSystem() } private func setupSystem() {   // 1.將layoutManager添加到textStorage   textStorage.addLayoutManager(layoutManager)   // 2.將textContainer添加到layoutManager   layoutManager.addTextContainer(textContainer) } override func layoutSubviews() {   super.layoutSubviews()  // 3.指定區域   textContainer.size = bounds.size }

2、重寫label的text屬性

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

3、匹配字符串

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

4、重繪文字

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

獲取label中URL的點擊

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

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕欧美日韩va免费视频| 中文字幕免费精品一区| 91成人国产在线观看| 国产精品高清免费在线观看| 一区二区三区四区在线观看视频| 国产成人在线一区| 国外成人在线播放| 国产精自产拍久久久久久| 国产不卡av在线| 91久久精品国产91久久| 日韩在线视频播放| 91免费国产网站| 国产z一区二区三区| 久久国产精彩视频| 国产精品美女呻吟| 国产精品亚洲аv天堂网| 国产91在线高潮白浆在线观看| 亚洲日本欧美日韩高观看| 国产欧美日韩丝袜精品一区| 欧美日韩亚洲系列| 亚洲综合最新在线| 欧美黑人一区二区三区| 一区二区欧美久久| 国产女人18毛片水18精品| 欧美日韩免费一区| 91免费综合在线| 精品久久久在线观看| 国产精品爽爽爽爽爽爽在线观看| 91精品国产免费久久久久久| 中文字幕在线精品| 亚洲精品国产免费| 一区二区欧美日韩视频| 精品偷拍一区二区三区在线看| 免费91在线视频| 精品综合久久久久久97| 欧美日韩在线看| 欧美另类极品videosbestfree| 亚洲福利在线看| 成年无码av片在线| 国产综合在线观看视频| 精品福利樱桃av导航| 欧美夫妻性视频| 亚洲最新在线视频| 91国自产精品中文字幕亚洲| 91久久久久久久| 国产999精品久久久| 久久久久久久久国产| 日韩极品精品视频免费观看| 久久这里只有精品99| 欧美综合第一页| 92福利视频午夜1000合集在线观看| 久久久www成人免费精品| 色婷婷综合成人av| 国产一区红桃视频| 高清日韩电视剧大全免费播放在线观看| 日韩av在线网页| 奇米一区二区三区四区久久| 久久中文字幕一区| 成人国产精品久久久久久亚洲| 日韩欧中文字幕| 91精品国产网站| 亚洲视频欧美视频| 91干在线观看| 日韩欧美精品在线观看| 日韩成人免费视频| 久久视频在线直播| 亚洲sss综合天堂久久| 欧美激情亚洲激情| 国产成人+综合亚洲+天堂| 国产精品视频最多的网站| 久久综合九色九九| 国产精品第一区| 欧美日韩电影在线观看| 国产日韩欧美日韩大片| 久久亚洲精品网站| 欧美激情一区二区三区高清视频| 国产精品亚洲片夜色在线| 中文字幕精品影院| 国产精品大陆在线观看| 成人观看高清在线观看免费| 国产丝袜视频一区| 青青草原成人在线视频| 精品视频在线观看日韩| 成人激情电影一区二区| 国产97色在线| 992tv成人免费视频| 亚洲午夜女主播在线直播| 日韩国产精品视频| 国产精品女人久久久久久| 亚洲网址你懂得| 欧美尤物巨大精品爽| 国产91网红主播在线观看| 久久免费高清视频| 亚洲成人在线网| 国产精品美女久久久免费| 欧美亚洲在线播放| 欧美另类69精品久久久久9999| 成人情趣片在线观看免费| 成人免费视频xnxx.com| 91久久精品一区| 国产精品久久久| 亚洲在线观看视频| 国产精品第七影院| 亚洲高清在线观看| 久久视频在线视频| 亚洲国产成人精品久久久国产成人一区| 国产一区红桃视频| 国产精品久久久久久久电影| 亚洲成av人影院在线观看| 成年人精品视频| 亚洲丝袜av一区| 国产精品wwwwww| 国产97在线|亚洲| 久久久久久久国产精品| 91网站在线看| 色偷偷888欧美精品久久久| 日韩av电影在线免费播放| 亚洲精品国产成人| 国产欧美精品日韩| 超碰精品一区二区三区乱码| 精品久久久久久电影| 26uuu亚洲伊人春色| 国产日韩在线观看av| 伊是香蕉大人久久| 久久久久久久久爱| 午夜精品久久久久久99热| 青青久久av北条麻妃黑人| 精品亚洲男同gayvideo网站| 国产精品久久久久免费a∨| 欧美精品久久久久久久免费观看| 国产精品第七十二页| 国产精品青草久久久久福利99| 日韩中文视频免费在线观看| 91免费欧美精品| 久久夜色精品国产亚洲aⅴ| 日韩av在线电影网| 夜夜嗨av一区二区三区四区| 国产精品热视频| 亚洲成色777777女色窝| 国产a∨精品一区二区三区不卡| 欧美视频在线看| 亚洲成人久久久久| 亚洲精品一区二区三区不| 欧美人在线观看| 成人在线激情视频| 欧美国产日韩在线| 国产三级精品网站| 欧美日韩国产丝袜美女| 国产精品视频区1| 疯狂做受xxxx欧美肥白少妇| 欧美日韩亚洲系列| 2021国产精品视频| 成人久久久久爱| 日韩精品免费综合视频在线播放| 国产精品国产亚洲伊人久久| 欧美一级大片视频| 成人在线视频福利| 最近中文字幕mv在线一区二区三区四区| 91在线色戒在线| 在线日韩日本国产亚洲| 亚洲激情国产精品| 国模私拍视频一区| 91精品国产91久久久| 欧美影院成年免费版|