swift 공부: 정규식 확인 및 제거

syi07030·2022년 3월 22일
1

swift

목록 보기
2/4

프로그래머스 level1 문제 [신규 아이디 추천] 을 풀다가 정규식 확인 부분에서 너무 많은 시간을 쏟았다,, 그래서 시행착오를 정리해보았다🙆‍♀️

나에게 가장 문제가 되었던 부분은

숫자/영어 소문자/./-/_ 를 제외한 나머지 문자들은 문자열에서 삭제하는 것

정규식 pattern 자체는 쉽다 ➡️ "0-9a-z._-"
이 정규식도 처음에는 문자열 전체 일치와 헷갈려서 "^[0-9a-z._-]$" 요렇게 작성했으나,, 내가 원하는 건 이렇게 하면 안 되는구나를 나중에 알았다,,ㅠ

문자열 정규식 확인은 찾아보니 거의 대부분 NSRegularExpression을 사용했다.
그 중 가장 도움이 되어 내 코드에 적용시킨 코드는 다음과 같다.

do{
        let regex = try NSRegularExpression(pattern:"[0-9a-z._-]", options:[])
        let nsString = NSString(string: answer)
        var results = regex.matches(in:answer, options:[],range:NSRange.init(location:0, length:nsString.length))
        let a = results.map{nsString.substring(with: $0.range)}
        answer = a.joined(separator:"")
    }catch let error{
        print("\(error.localizedDescription)")
    }

(출처: https://gist.github.com/devssun/d1c0d20daa300c08cc921824a912eb72)

이렇게 하면 원하는 대로 정규식에 맞지 않는 문자들을 제거하고 다시 제거된 문자들을 합쳐 문자열로 반환한다.
하지만 문제는 테스트 케이스 중 하나가 시간 초과가 되었다,,안돼,,

그래서 생각한 방법이 바로 replacingOccurrences를 사용하는 거였다.
이 메서드는 말 그대로 문자열에서 일부 문자들을 치환할 때 사용되는데 options 설정을 .regularExpression로 한다면 정규식 패턴에 어긋나는 문자들을 "" 이렇게 빈 문자열로 치환할 수 있다.

    answer = answer.replacingOccurrences(of:"[^0-9a-z._-]",with:"", options: .regularExpression)


이런식으로 한 줄로 정규식 패턴 확인에 제거까지 완료할 수 있다👏
++ 참고로 정규식 앞에 ^를 붙임으로써 뒤에 나오는 정규식에 반대되는 문자들을 말한다

참조
https://gist.github.com/devssun/d1c0d20daa300c08cc921824a912eb72
https://tngusmiso.tistory.com/62

profile
잭과 근나물

0개의 댓글