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 의 정규 표현 식 소결 입 니 다.마음 에 드 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
백그라운드에서 값을 계산하고 Swift 동시성 이후에 결과 사용값을 계산해야 하고 메인 스레드를 차단하지 않으려면 계산된 값을 반환하는 Swift Task 구조에서 해당 값을 계산하면 됩니다. Swift 동시성 이전에는 백그라운드 대기열로 이동하여 필요한 값을 계산하고 필요한 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.