티스토리 뷰

반응형

안녕하세요 :) Zedd입니다.

저번에 <일치하는 모든 문자열의 Attribute를 바꾸고 싶을 때>글을 썼었는데, 

라고 데이브팡님이 댓글을 달아주셨어요..! 정규식은 뭔가 Validation검사할 때만 쓰는 좀 그런거로 생각을 하고 있어서 range구할 때 정규식을 쓸 생각을 못했는데, 정규식으로 해보니까..간-단....그럼 시작할게요 :)


일치하는 모든 문자열의 Attribute를 바꾸고 싶을 때 (정규식 이용하기)



정규식에 관한 자세한 이야기는 하지 않을게요! 예를들어 패턴을 만드는 법이라던가...

그냥 어떻게 하는지만...

//regex : zedd, text : hello, \nzedd. ()Zedd hava a ZeDD zedd\nzedd!


let regex = try NSRegularExpression(pattern: regex, options: [.caseInsensitive])


let results = regex.matches(in: text, range: NSRange(location:0, length:text.count))


(현재 do-catch문으로 감싸진 상태라서 try만 쓴거에요!)


자...핵심 코드인데요, 먼저 NSRegularExpression은 정규식을 검사 할 수 있는 클래스죠? 

여기에 pattern을 넣어주고, options!!!!우리가 저번에 배운 그..옵션과 매우 비슷하지만, 다른 옵션들이 많이 있어요. 


이 옵션에 대해 더 알고싶은 분들은 <NSRegularExpression.Options>글을 읽고와주세요 :)


저는 caseInsensitive 옵션을 넣었으니, zedd든 ZEDD든 case상관없이 range를 찾겠다는  것입니다! 

regex는 NSRegularExpression타입으로, 다양한 메소드들이 존재하는데요, 우리는 matches라는 메소드를 사용해서 text에 들어있는 zedd들을 찾을거에요.

matches말고도 NSRegularExpression에는 다양한 메소드들이 존재하는데, 자세한 내용은 NSRegularExpression의 Apple문서를 참고해주세요. 

그 결과를 우리가 result라는 상수에 담았는데요, 이 result는 [NSTextCheckingResult]타입이랍니다.

NSTextCheckingResult에는 프로퍼티들이 좀 많은데..여기에 range라는 프로퍼티가 있습니다.


for currentMatch in results{

    print(currentMatch.range)

 }

 

이렇게 range를 출력해보면



이렇게 zedd든 ZEDD든 case에 상관없이 zedd인것들에 해당하는 range가 나오게 됩니다. 우리가..range만 있으면..attribute를 추가할 수 있죠?


let attrStr = NSMutableAttributedString(string: text)

results.forEach({ (matches) in

       attrStr.addAttribute(.foregroundColor, value: UIColor.blue, range: matches.range)

})

 

갸ㅑㅑㅑ

<일치하는 모든 문자열의 Attribute를 바꾸고 싶을 때>글에서는 막 복잡하게 location에서 막 계산해주고 그랬잖아요? 그런 과정이 없어서 편한 것 같아요 :)


코드 첨부하는 걸 깜빡했네요 :)... 위 코드는 제 github에 올려놨으니 참고하세용!!!





반응형