-
초보의 정규표현식 배우기일상, 생활 기록 2020. 5. 12. 22:24
이전에 정규표현식에 대해서 잠깐 들어본 적이 있었습니다. 하지만 처음 정규표현식을 검색해봤을 땐..
무슨 외계어가 있지..?
정말 처음 봤을 땐 이상한 문자들로 이루어진 문자열들이라 알아들을 수가 없었고, 공부하고 싶지도 않았습니다.
하지만 시간이 흘러 얼마전 코딩테스트를 보면서 정규표현식을 잠깐 접하고 문자열에 대해서 어느정도 친해지고 있었습니다.
이번 YAPP에서 만들고 있는 프로젝트 중에 로그인, 회원가입 화면을 구현하고 있는데 아이디와 비밀번호에 대한 필터링이 필요했습니다.
이러한 기능을 만드려면 정규표현식이 필수적이었죠. 그래서 정규표현식을 공부하고 정리해보는 시간을 가지려고 합니다.
무슨 목적의 정규식이 필요한지 정하자
사실 정규표현식을 기능적으로만 사용하려면 검색만 하면 됩니다. 대부분의 정규표현식은 어떤 언어를 불문하고 제공하고 있으며, 그만큼 레퍼런스가 많다는 것입니다. 예를 들면, 저는 이메일을 검증할 수 있는 정규식이 필요한데, 검색하면 이에 대한 정규식을 쉽게 찾아볼 수 있습니다. 그래서 어떤 정규식이 필요한건지만 알면 누구나 쉽게 정규식을 사용할 수 있습니다.
하지만 응용을 하려면 다르겠죠. 비밀번호에 특수문자가 들어가야한다거나, 몇 자리가 필요한지는 조금 더 변형이 필요합니다. 이럴 때는, 정규표현식에 대한 내용을 찾아볼 수 밖에 없겠죠.
정규표현식을 거의 처음 접할 때 이해하기 쉬운 사이트는 아래 링크를 들어가보세요. 도식화되어 있어서 어떤 흐름으로 진행되는지 한 눈에 이해하기 쉬웠습니다.
정규 표현식을 소개합니다.
http://www.nextree.co.kr/p4327/코틀린에서의 정규 표현식
저는 주로 안드로이드 개발을 하고 있습니다. 그래서 주로 자바나 코틀린을 사용하는데요, 코틀린에서 정규 표현식을 사용하는 법에 대해서 알아보겠습니다.
정규표현식을 사용하는 가장 큰 목적은 문자열 일치 여부를 return하는 것입니다. 그러려면 당연히 기존 문자열과 비교할만한 기준이 되는 문자열을 설정해야겠죠. 자바에서는 Pattern이라는 클래스를 이용해서 기준 문자열을 생성했다면, 코틀린에선 Regex라는 클래스를 사용합니다.
expect class Regex { constructor(pattern: String) constructor(pattern: String, option: RegexOption) constructor(pattern: String, options: Set<RegexOption>) val pattern: String val options: Set<RegexOption> fun matchEntire(input: CharSequence): MatchResult? infix fun matches(input: CharSequence): Boolean fun containsMatchIn(input: CharSequence): Boolean fun replace(input: CharSequence, replacement: String): String fun replace(input: CharSequence, transform: (MatchResult) -> CharSequence): String fun replaceFirst(input: CharSequence, replacement: String): String
이것은 코틀린에서 정의된 Regex 클래스인데요, 가끔씩 이렇게 궁금한 클래스가 있으면 Ctrl(command)+B를 통해 구현 위치로 가서 해당 클래스가 어떤 구조를 가지고 있는지 확인해보면 재밌습니다!
이 Regex 클래스를 생성하려면 3가지 방법이 있습니다.
- Regex 생성자를 이용하는 방법
val reg1 = Regex("\\(([A-Z])\\w+\\)")
- String 클래스의 확장 함수 toRegex()를 이용하는 방법
val reg2 = "\\(([A-Z])\\w+\\)".toRegex()
- Regex 클래스의 Companion Object 함수인 fromLiteral()를 이용하는 방법
val reg3 = Regex.fromLiteral("\\(([A-Z])\\w+\\)")
이 중 마지막 fromLiteral() 함수는 ()안의 문자열을 문자열 리터럴로 입력받게되는데요,
1번, 2번의 정규식과는 다르게 "(([A-Z])w+)" 문자열 자체와 일치하는지를 확인합니다.
안드로이드 스튜디오 화면에서 모습인데요, 보시다시피 reg3은 아얘 문자열 처리가 된 것임을 알 수 있습니다.
이 내용은 하단 블로그에서 참조했습니다.
코틀린에서 정규 표현식 사용하기
https://medium.com/@limgyumin/%EC%BD%94%ED%8B%80%EB%A6%B0-%EC%97%90%EC%84%9C-%EC%A0%95%EA%B7%9C-%ED%91%9C%ED%98%84%EC%8B%9D-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-2c655ba35c36정규 표현식은 계속 접해봐야한다. 문자열도!
이 글을 쓰는 시점의 저도 정규 표현식에 대해 익숙하지 않다보니 계속 공부가 필요할 것 같습니다. 특히 정규 표현식 표를 읽고 필요로 하는 정규식을 작성할 줄 아는 능력이 필요한데요, 특히 웹이나 모바일은 문자열에 대한 처리가 매우 빈번합니다. 얼마전 코딩 테스트를 준비하면서 이를 크게 느꼈는데 문자열에 대한 요구가 많았고, 이는 단순히 코딩 테스트에서 많이 나와서가 아니라, 우리가 다루는 데이터의 상당 부분이 문자열이기 때문입니다.
문자열을 다루는데 가장 강력한 무기 중 하나가 정규 표현식입니다. 멀지 않은 시간에 정규 표현식에 대해 더 깔끔하게 다듬은 글로 찾아오겠습니다.
'일상, 생활 기록' 카테고리의 다른 글
무엇을 참조하고 있는지 정확히 파악하자 (0) 2020.08.08 개인정보처리방침 - 군머니티 (0) 2020.07.16 첫 코딩 테스트 후기 (0) 2020.05.11 진짜 개발은 리팩토링부터 시작된다 (0) 2020.04.18 배우고 싶다면 코드리뷰 (0) 2020.03.26