swift 의 정규 표현 식 소결

선진 적 인 프로 그래 밍 언어 로 서 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 = "\\[.*?\\]"
  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
url 하 이 라 이 트 를 위 한 사용자 정의 UILabel
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  ,      drawTextInRect
override 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 의 정규 표현 식 소결 입 니 다.마음 에 드 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기