濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > swift中的正則表達(dá)式小結(jié)

swift中的正則表達(dá)式小結(jié)

熱門標(biāo)簽:400免費(fèi)電話去哪申請(qǐng) 線上教育ai外呼系統(tǒng) 菏澤智能ai電銷機(jī)器人銷售公司 鄂州人工智能電銷機(jī)器人軟件 實(shí)用地圖標(biāo)注app 地圖標(biāo)注商戶中心要收錢多少 css百度地圖標(biāo)注位置顯示 宿遷智能外呼系統(tǒng)供應(yīng)商 地圖標(biāo)注字母的軟件

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

正則表達(dá)式的用處:

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

- 電話號(hào)碼,電子郵箱,URL...

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

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

- 要寫出沒有漏洞正則判斷,需要大量的測(cè)試,通常最終結(jié)果非常負(fù)責(zé)

過濾篩選字符串,網(wǎng)絡(luò)爬蟲

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

語(yǔ)法規(guī)則

使用過程

1、創(chuàng)建規(guī)則
2、創(chuàng)建正則表達(dá)式對(duì)象
3、開始匹配

代碼示例

private func check(str: String) {
 // 使用正則表達(dá)式一定要加try語(yǔ)句
 do {
  // - 1、創(chuàng)建規(guī)則
  let pattern = "[1-9][0-9]{4,14}"
  // - 2、創(chuàng)建正則表達(dá)式對(duì)象
  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))
  // 輸出結(jié)果
  for checkingRes in res {
   print((str as NSString).substringWithRange(checkingRes.range))
  }
 }
 catch {
  print(error)
 }
}

其他幾個(gè)常用方法        

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

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

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

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 }
}
// 這個(gè)是類型選擇
 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) {
 // 創(chuàng)建一個(gè)正則表達(dá)式對(duì)象
 do {
  let dataDetector = try NSDataDetector(types: NSTextCheckingTypes(NSTextCheckingType.Link.rawValue))
  // 匹配字符串,返回結(jié)果集
  let res = dataDetector.matchesInString(str, options: NSMatchingOptions(rawValue: 0), range: NSMakeRange(0, str.characters.count))
  // 取出結(jié)果
  for checkingRes in res {
   print((str as NSString).substringWithRange(checkingRes.range))
  }
 }
 catch {
  print(error)
 }
}

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

如果想同時(shí)匹配多個(gè)規(guī)則 ,可以通過 "|" 將多個(gè)規(guī)則連接起來

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

 /**
顯示字符中的表情
- parameter str: 匹配字符串
*/
private func getEmoji(str:String) {
 let strM = NSMutableAttributedString(string: str)
 do {
  let pattern = "\\[.*?\\]"
  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)
   // 轉(zhuǎn)換字符串到表情
   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高亮顯示

主要用到三個(gè)類

NSTextStorage
NSLayoutManager
NSTextContainer

自定義UILabel來實(shí)現(xiàn)url高亮

1、定義要用到的屬性

 /*
 只要textStorage中的內(nèi)容發(fā)生變化, 就可以通知layoutManager重新布局
 layoutManager重新布局需要知道繪制到什么地方, 所以layoutManager就會(huì)文textContainer繪制的區(qū)域
 */
 // 準(zhǔn)們用于存儲(chǔ)內(nèi)容的
 // textStorage 中有 layoutManager
 private lazy var textStorage = NSTextStorage()
 // 專門用于管理布局
 // layoutManager 中有 textContainer
 private lazy var layoutManager = NSLayoutManager()
 // 專門用于指定繪制的區(qū)域
 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.指定區(qū)域
   textContainer.size = bounds.size
 }

2、重寫label的text屬性

override var text: String?
  {
  didSet{
 // 1.修改textStorage存儲(chǔ)的內(nèi)容
 textStorage.setAttributedString(NSAttributedString(string: text!))
 // 2.設(shè)置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.創(chuàng)建一個(gè)正則表達(dá)式對(duì)象
  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取出結(jié)果
   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調(diào)用setNeedsDisplay方法, 系統(tǒng)會(huì)促發(fā)drawTextInRect
override func drawTextInRect(rect: CGRect) {
 // 重繪
 // 字形 : 理解為一個(gè)小的UIView
 /*
 第一個(gè)參數(shù): 指定繪制的范圍
 第二個(gè)參數(shù): 指定從什么位置開始繪制
 */
 layoutManager.drawGlyphsForGlyphRange(NSMakeRange(0, text!.characters.count), atPoint: CGPointZero)
}

獲取label中URL的點(diǎn)擊

如果要獲取URL的點(diǎn)擊,那么必須獲取點(diǎn)擊的范圍

 override func touchesBegan(touches: SetUITouch>, withEvent event: UIEvent?) {
 // 1、獲取手指點(diǎn)擊的位置
 let touch = (touches as NSSet).anyObject()!
 let point = touch.locationInView(touch.view)
 print(point)
 // 2、獲取URL區(qū)域
 // 注意: 沒有辦法直接設(shè)置UITextRange的范圍
 let range = NSMakeRange(10, 20)
 // 只要設(shè)置selectedRange, 那么就相當(dāng)于設(shè)置了selectedTextRange
 selectedRange = range
 // 給定指定的range, 返回range對(duì)應(yīng)的字符串的rect
 // 返回?cái)?shù)組的原因是因?yàn)槲淖挚赡軗Q行
 let array = selectionRectsForRange(selectedTextRange!)
 for selectionRect in array {
   if CGRectContainsPoint(selectionRect.rect, point) {
    print("點(diǎn)擊了URL")
   }
 }
}

以上內(nèi)容就是小編跟大家介紹的swift中的正則表達(dá)式小結(jié),希望大家喜歡。

您可能感興趣的文章:
  • Swift的74個(gè)常用內(nèi)置函數(shù)介紹
  • Swift教程之字符串和字符詳解
  • 升級(jí)到Swift 4.0可能遇到的坑總結(jié)
  • Swift中的指針操作和使用詳細(xì)介紹
  • Swift中的命名空間詳解

標(biāo)簽:梅州 恩施 六安 鞍山 池州 三亞 綿陽(yáng) 咸陽(yáng)

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《swift中的正則表達(dá)式小結(jié)》,本文關(guān)鍵詞  swift,中的,正則,表達(dá)式,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《swift中的正則表達(dá)式小結(jié)》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于swift中的正則表達(dá)式小結(jié)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    临高县| 扎囊县| 公安县| 东兴市| 达拉特旗| 娄烦县| 鄂州市| 岳阳市| 南投市| 凤凰县| 大荔县| 吉木乃县| 石门县| 保亭| 大兴区| 永州市| 徐闻县| 息烽县| 南靖县| 石泉县| 宜兴市| 邹平县| 调兵山市| 固安县| 奉贤区| 嘉祥县| 若尔盖县| 贡山| 安岳县| 于田县| 砚山县| 荔浦县| 南投县| 塔城市| 定结县| 青冈县| 辛集市| 积石山| 万安县| 泽库县| 正镶白旗|