티스토리 뷰
728x90
반응형
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | extension String{ func getArrayAfterRegex(regex: String) -> [String] { do { let regex = try NSRegularExpression(pattern: regex) let results = regex.matches(in: self, range: NSRange(self.startIndex..., in: self)) return results.map { String(self[Range($0.range, in: self)!]) } } catch let error { print("invalid regex: \(error.localizedDescription)") return [] } } } | cs |
> regular expression 은 기본적으로 case sensitive하다 (대문자 / 소문자 다르게 인식)
1) ^ $ (원하는 것 | 원하는 것)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | let str = "Hello Hello #hi #Hello ##nam WOW www Hello" // ^ = 시작에 위치하는 대상 지목 print(str.getArrayAfterRegex(regex:"^Hello")) //["Hello"] // $ = 끝에 위치하는 대상 지목 print(str.getArrayAfterRegex(regex:"Hello$")) //["Hello"] // Hello 4개 다 나옴 print(str.getArrayAfterRegex(regex:"Hello")) //["Hello", "Hello", "Hello", "Hello"] // 여러개 print(str.getArrayAfterRegex(regex:"(Hello|www|hi)")) // ["Hello", "Hello", "hi", "Hello", "www", "Hello"] | cs |
2) .
1 2 3 4 5 6 7 8 9 10 | let str = "Hello Hello #hi #Hello ##nam WOW www Hello" // . = any character // . 3개 = 3개씩 끊는다 print(str.getArrayAfterRegex(regex: "...")) //중괄호 {} 로 원하는 수량을 정확하게 지정할 수 있다 print(str.getArrayAfterRegex(regex: ".{3}")) //["Hel", "lo ", " He", "llo", " #h", "i #", "Hel", "lo ", "##n", "am ", "WOW", " ww", "w H", "ell"] | cs |
3) [] 한 문자
1 2 3 4 5 6 7 8 9 10 11 12 13 | let str = "Hello Hello #hi #Hello ##nam WOW www Hello" // [] = 문자하나에 해당된다 // [W-Z] = W부터 Z까지 한문자를 찾는다 ( 대문자만 ) print(str.getArrayAfterRegex(regex: "[W-Z]")) //["W", "W"] // ^를 대괄호 안에 사용하면 부정(not) 의 의미 // [^W-Z] = W에서 Z까지 가 아닌 한 문자 print(str.getArrayAfterRegex(regex: "[^W-Z]")) //["H", "e", "l", "l", "o", " ", " ", "H", "e", "l", "l", "o", " ", "#", "h", "i", " ", "#", "H", "e", "l", "l", "o", " ", "#", "#", "n", "a", "m", " ", "O", " ", "w", "w", "w", " ", "H", "e", "l", "l", "o"] | cs |
4) * + ?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | // * = 0 ~ 여러개 // + = 1 ~ 여러개 // ? = 0 ~ 1 let test = "aabc abc bc" print(test.getArrayAfterRegex(regex: "a*b")) //["aab", "ab", "b"] print(test.getArrayAfterRegex(regex: "a+b")) //["aab", "ab"] print(test.getArrayAfterRegex(regex: "a?b")) //["ab", "ab", "b"] | cs |
5) .과 * + ? 혼합
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 | let str = "Hello Hello #hi #Hello ##nam WOW www Hello" // . 과 * + ? 의 혼합 //H뒤에 문자 하나 print(str.getArrayAfterRegex(regex: "H.")) //["He", "He", "He", "He"] //H뒤에 문자 0이상 print(str.getArrayAfterRegex(regex: "H.*")) // ["Hello Hello #hi #Hello ##nam WOW www Hello"] //H뒤에 문자 1개 이상 print(str.getArrayAfterRegex(regex: "H.+")) // ["Hello Hello #hi #Hello ##nam WOW www Hello"] //H뒤에 문자 0개 또는 1개 인거 print(str.getArrayAfterRegex(regex: "H.?")) //["He", "He", "He", "He"] //만약 str이 "Hello Hello #hi #Hello ##nam WOW www Hello H"면 output은 ["He", "He", "He", "He", "H"] print(str.getArrayAfterRegex(regex: "H....")) //["Hello", "Hello", "Hello", "Hello"] print(str.getArrayAfterRegex(regex: "He..")) //["Hell", "Hell", "Hell", "Hell"] | cs |
6) 대괄호 안의 ^ ( 1번과 달라요 )
^를 대괄호 안에 사용하면 부정(not) 의 의미
ex) [^W-Z] = W에서 Z까지 가 아닌 한 문자
ex) [^ ]+ = 공백이 아닌 문자 1개 이상
print("Hi Hello".getArrayAfterRegex(regex: "[^ ]+"))
// ["Hi", "Hello"]
ex)
// :랑 *랑 !랑 A에서 D까지 문자(ABCD) 가 아닌 문자한개이상인 친구들을 뽑자
print("09:09*09!09ABCD".getArrayAfterRegex(regex: "[^:*!A-D]+"))
//["09", "09", "09", "09"]
7) 실제로 쓰이는 예
ex0]
1 2 3 4 5 | //숫자만 꺼낸다 print("09:09".getArrayAfterRegex(regex: "[0-9]+")) // : 아닌 문자1개이상인 친구들만 꺼낸다 print("09:09".getArrayAfterRegex(regex: "[^:]+")) //["09", "09"] | cs |
ex1]
1 2 3 4 5 | let str = "Hello Hello #hi #Hello ##nam WOW www Hello" // 태그가 있는 단어를 찾기 print(str.getArrayAfterRegex(regex:"#[a-zA-Z0-9]+")) //["#hi", "#Hello", "#nam"] // 만약 태그가 두개인것을 그대로 뽑고 싶으면 #을 붙여주기 print(str.getArrayAfterRegex(regex:"#[a-zA-Z0-9#]+")) // 또는 이렇게 print(str.getArrayAfterRegex(regex: "#[^ ]+")) //["#hi", "#Hello", "##nam"] | cs |
1 2 3 4 5 6 7 8 | let str = "Hello Hello #hi #Hello ##nam WOW www Hello" // # 태그가 있는 단어들을 찾아서 태그 때고 다 소문자로 해주기 let sliceArray = str.getArrayAfterRegex(regex:"#[a-zA-Z0-9]+").map { (slice) in slice.replacingOccurrences(of: "#", with: "").lowercased() } print(sliceArray) //["hi", "hello", "nam"] | cs |
ex2]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | // 여기서 요일들만 빼내올거임 let test = "Monday is good, Tuesday Friday" //방법1 print(test.getArrayAfterRegex(regex: "(Mon|Tues|Fri)day")) //["Monday", "Tuesday", "Friday"] //방법2 print(test.getArrayAfterRegex(regex: "[a-zA-Z]+day")) //["Monday", "Tuesday", "Friday"] //방법3 print(test.getArrayAfterRegex(regex: "[^ ]+day")) //["Monday", "Tuesday", "Friday"] // 이렇게는 안됨!! invalid regex print(test.getArrayAfterRegex(regex: "[+]day")) print(test.getArrayAfterRegex(regex: "[]+day")) print(test.getArrayAfterRegex(regex: "[^]+day")) //5글자 이상 print(test.getArrayAfterRegex(regex: "[a-zA-Z]{5,}")) //["Monday", "Tuesday", "Friday"] | cs |
ex3] 카카오 코딩테스트 문제 '1차 다트 게임' 입력을 3등분으로 짜를 때도 편하게!_!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | // [0-9]+ - 숫자 // [(S|D|T)] - 보너스 // [(*|#)]? - 옵션 print("1D2S#10S".getArrayAfterRegex(regex: "[0-9]+[(S|D|T)][(*|#)]?")) //["1D", "2S#", "10S"] print("1000D2S#10S".getArrayAfterRegex(regex: "[0-9]+[(S|D|T)][(*|#)]?")) //["1000D", "2S#", "10S"] print("1D2S10S".getArrayAfterRegex(regex: "[0-9]+[(S|D|T)][(*|#)]?")) //["1D", "2S", "10S"] print("1D#2S*3S".getArrayAfterRegex(regex: "[0-9]+[(S|D|T)][(*|#)]?")) //["1D#", "2S*", "3S"] | cs |
* 추천 사이트
https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/정규식#special-negated-character-set
반응형
'🍏 > Swift' 카테고리의 다른 글
[Swift] 동적프로그래밍 - 배낭채우기 문제를 Swift로 구현해보자 (0) | 2018.09.27 |
---|---|
[Swift] Swift로 짜보는 다익스트라 알고리즘 (최단경로를 찾아요) (1) | 2018.09.19 |
[Swift] Static / Class / Final Class fuction & variable 차이 (0) | 2018.07.27 |
[Swift] ?? 연산자는 어떤 의미일까 (0) | 2018.07.24 |
[Swift] 다운캐스팅(downcasting) (0) | 2018.02.20 |
댓글
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- 구글 Geocoding API
- PencilKit
- Watch App for iOS App vs Watch App
- 장고 Custom Management Command
- github actions
- Django FCM
- flutter build mode
- cocoapod
- 플러터 싱글톤
- Flutter Clipboard
- Python Type Hint
- 장고 URL querystring
- Flutter getter setter
- SerializerMethodField
- Flutter 로딩
- ipad multitasking
- flutter 앱 출시
- flutter deep link
- Sketch 누끼
- Django Heroku Scheduler
- Flutter Spacer
- Flutter Text Gradient
- Django Firebase Cloud Messaging
- ribs
- flutter dynamic link
- 플러터 얼럿
- DRF APIException
- METAL
- Dart Factory
- drf custom 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 |
글 보관함