最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

swift中的正則表達式小結

 更新時間:2015年10月09日 10:41:38   投稿:mrr  
正則表達式是對字符串操作的一種邏輯公式,用事先定義好的一些特定字符、及這些特定字符的組合,組成一個"規(guī)則字符串",這個"規(guī)則字符串"用來表達對字符串的一種過濾邏輯。

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

正則表達式的用處:

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

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

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

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

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

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

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

語法規(guī)則

使用過程

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

代碼示例

private func check(str: String) {
 // 使用正則表達式一定要加try語句
 do {
  // - 1、創(chuàng)建規(guī)則
  let pattern = "[1-9][0-9]{4,14}"
  // - 2、創(chuàng)建正則表達式對象
  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)
 }
}

其他幾個常用方法        

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

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

看官網(wǎng)文檔解釋,可以知道這個 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) {
 // 創(chuàng)建一個正則表達式對象
 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)
 }
}

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

如果想同時匹配多個規(guī)則 ,可以通過 "|" 將多個規(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)
   // 轉換字符串到表情
   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來實現(xiàn)url高亮

1、定義要用到的屬性

 /*
 只要textStorage中的內容發(fā)生變化, 就可以通知layoutManager重新布局
 layoutManager重新布局需要知道繪制到什么地方, 所以layoutManager就會文textContainer繪制的區(qū)域
 */
 // 準們用于存儲內容的
 // 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存儲的內容
 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.創(chuàng)建一個正則表達式對象
  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方法, 系統(tǒng)會促發(fā)drawTextInRect
override func drawTextInRect(rect: CGRect) {
 // 重繪
 // 字形 : 理解為一個小的UIView
 /*
 第一個參數(shù): 指定繪制的范圍
 第二個參數(shù): 指定從什么位置開始繪制
 */
 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區(qū)域
 // 注意: 沒有辦法直接設置UITextRange的范圍
 let range = NSMakeRange(10, 20)
 // 只要設置selectedRange, 那么就相當于設置了selectedTextRange
 selectedRange = range
 // 給定指定的range, 返回range對應的字符串的rect
 // 返回數(shù)組的原因是因為文字可能換行
 let array = selectionRectsForRange(selectedTextRange!)
 for selectionRect in array {
   if CGRectContainsPoint(selectionRect.rect, point) {
    print("點擊了URL")
   }
 }
}

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

相關文章

  • 實用正則表達式匹配和替換大全

    實用正則表達式匹配和替換大全

    正則表達式非常有用,查找、匹配、處理字符串、替換和轉換字符串,輸入輸出等。而且各種語言都支持,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2016-11-11
  • js正則匹配table tr

    js正則匹配table tr

    這篇文章主要介紹了js正則匹配table tr,需要的朋友可以參考下
    2007-06-06
  • re模塊的正則匹配的表達式詳解

    re模塊的正則匹配的表達式詳解

    這篇文章主要介紹了使用的re模塊的正則匹配的表達式,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-07-07
  • 正則表達式匹配任意字符(包括換行符)的寫法

    正則表達式匹配任意字符(包括換行符)的寫法

    在正則中,匹配任意字符,其實寫法網(wǎng)上有很多,但因為各種軟件或程序寫法不支持等原因導致的問題,大家可以多研究。
    2009-08-08
  • 除捕獲組的語法外,其它的(?...)語法都不是捕獲組的驗證

    除捕獲組的語法外,其它的(?...)語法都不是捕獲組的驗證

    這篇文章主要介紹了除捕獲組的語法外,其它的(?...)語法都不是捕獲組的驗證,需要的朋友可以參考下
    2017-04-04
  • Regex正則表達式判斷密碼強度

    Regex正則表達式判斷密碼強度

    這里用到Regex表達式,雖然還是經(jīng)常使用,但是對其語法還是一知半解。主要一般用到都比較簡單,不需要多重判斷,這篇文章主要介紹了Regex正則表達式判斷密碼強度,需要的朋友可以參考下
    2023-02-02
  • 正則表達式(regex)簡介和基本用法小結

    正則表達式(regex)簡介和基本用法小結

    正則表達式 (regex) 是用于模式匹配和文本操作的強大工具, 它們廣泛應用于編程、文本處理、數(shù)據(jù)驗證等領域,這篇文章主要介紹了正則表達式 (regex) 簡介和基本用法,需要的朋友可以參考下
    2024-04-04
  • IOS正則表達式判斷輸入類型(整理)

    IOS正則表達式判斷輸入類型(整理)

    在開發(fā)過程中,有時需要對用戶輸入的類型做判斷,最常見是在注冊頁面即用戶名和密碼。接下來通過本文給大家分享IOS正則表達式判斷輸入類型,一起學習吧
    2017-01-01
  • jQuery正則表達式的使用方法步驟詳解

    jQuery正則表達式的使用方法步驟詳解

    本文主要和大家分享的就是jQuery學習中正則的使用,正則在jquery里面并沒有比JavaScript多哪些知識,基本上是一樣的,只是選擇器更好了一點,一起來看看吧
    2016-12-12
  • javascript中正則表達式反向引用示例介紹

    javascript中正則表達式反向引用示例介紹

    這篇文章主要介紹了javascript中正則表達式反向引用,需要的朋友可以參考下
    2014-03-03

最新評論

修文县| 长岭县| 互助| 大荔县| 广东省| 凤城市| 邢台市| 公安县| 洛扎县| 沂水县| 镇宁| 姜堰市| 任丘市| 丽水市| 专栏| 克拉玛依市| 纳雍县| 大宁县| 江西省| 铁力市| 宝应县| 贡嘎县| 和平县| 万安县| 诸城市| 牙克石市| 舟曲县| 海盐县| 鄂托克旗| 康马县| 舒城县| 平安县| 东丰县| 稷山县| 西华县| 陇西县| 丰都县| 武胜县| 涞源县| 亳州市| 黎川县|