티스토리 뷰

반응형
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(inself,
                                        range: NSRange(self.startIndex..., inself))
            return results.map {
                String(self[Range($0.range, inself)!])
            }
        } 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

반응형
댓글