激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

香港云服务器
服務器之家 - 編程語言 - 正則表達式 - swift中的正則表達式小結

swift中的正則表達式小結

2020-08-17 15:37正則教程網 正則表達式

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

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

正則表達式的用處:

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

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

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

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

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

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

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

語法規則

swift中的正則表達式小結

swift中的正則表達式小結

使用過程

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

代碼示例

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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)
 }
}

其他幾個常用方法        

?
1
2
3
4
5
6
7
8
9
10
// 匹配字符串中所有的符合規則的字符串, 返回匹配到的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。在使用時指定要匹配的類型

?
1
2
3
4
5
6
7
8
9
10
11
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示例

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
匹配字符串中的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)
 }
}

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/**
顯示字符中的表情
- 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來實現url高亮

1、定義要用到的屬性

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/*
只要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屬性

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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、匹配字符串

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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、重繪文字

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

獲取label中URL的點擊

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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中的正則表達式小結,希望大家喜歡。

延伸 · 閱讀

精彩推薦
423
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 激情网站免费观看 | 九色激情网 | 91成人久久 | 一级做人爱c黑人影片 | 国产精品jk白丝蜜臀av软件 | 成人午夜免费福利 | 看免费毛片| av黄色片网站 | 国产宾馆3p国语对白 | 成人福利视频在线观看 | 国产成人强伦免费视频网站 | 日韩美香港a一级毛片免费 欧美一级淫片007 | 欧美黄色试片 | 一级看片免费视频 | 国产一区国产二区在线观看 | 欧美国产精品一区二区 | 日韩电影一区二区 | 在线播放中文 | 午夜精品久久久久久中宇 | 精品国产一区二区三区在线观看 | 国产在线欧美日韩 | 免费看一级毛片欧美 | 欧产日产国产精品v | 羞羞视频免费观看网站 | 亚州综合一区 | 亚洲精品久久久久www | 日本成人二区 | 日本一区二区在线 | 韩国三级日本三级香港三级黄 | 国产成人在线观看网站 | 亚洲精品欧美二区三区中文字幕 | 精品国内视频 | 国产美女视频一区二区三区 | 国产色视频免费 | 午夜视频色 | 久久久久中精品中文字幕19 | 91网站在线观看视频 | 日韩欧美色综合 | 叉逼视频 | 宅男噜噜噜66国产在线观看 | 黄在线 |