본문 바로가기

개발자노트/우아한 테코톡 감상

[10분 테코톡] 🪐빙봉의 정규 표현식

1. 정규표현식의 이해


1951년 생김
수학자 Stephen Cole Kleene에 의해 생겨남
수학적인 개념으로 발생하게 됨
- 편집기의 패턴 매칭을 시작으로 사용
- grep 명령어가 정규표현식을 사용
- vi,emacs 같은 편집기나 sed,awk 같은 유닉스 명령어에 정규표현식이 추가
- 이후, IDE와 여러 프로그래밍 언어의 표준 라이브러리로 지정됨

능력 : 특정 패턴을 가지고 문자열을 찾을 수 있다.


정규표현식이 있는 것과 없는 것의 차이


- 전화번호 유효성 검증 요구사항
1. 맨 앞의 번호는 010으로 시작
2. 대시('-')로 구분
3. 구분된 숫자는 4자리의 숫자가 와야함

- 정규표현식이 없다면 많은 if문이 사용될 것임


메타문자

. : 모든문자
[] : 대괄호 안에 들어가 있는 문자를 찾음, 대괄호 안에서 ^는 not을 의미
| : or
\s : 공백
\d : [0-9] 
\w : 영문자, 숫자, 밑줄[0-9a-zA-Z_]


수량자

? : 앞 문자가 없거나 하나 있음 ({0,1}) / 처음에 발견했을 때 쉬고 다시 찾음
+: 앞 문자가 하나 이상 ({1.})
*: 앞 문자가 0개 이상임 ({0.})
{n.m} : 앞 문자가 n개 이상 m개 이하
{n.}: 앞 문자가 n개이상, 위의 형태에서 m이 생략딘 형태
{n} : 앞 문자가 n개


메타문자 - 문자를 나타내는 문자
수량자 - 앞 문자의 개수


정규표현식 = 패턴구분자 시작 + 작성할 패턴 + 패턴구분자 끝 + 패턴 변경자
/          패턴    / g

전화번호 정규표현식 분석
핵심 : 메타문자와 수량자를 잘 파악하자

강점: 패턴으로 검증 가능! if문을 많이 안써도 된다.
약점: 너무 안 좋은 가독성! 유지보수하기 너무 힘들다.
-> 간단한 검증일 때는 if문으로 해결하자. 메서드 명을 통해 가독성을 높이자
복잡한 검증이 있을 때만 정규표현식을 사용하자. 주석을 달아서 가독성을 높이자.

 



2. 정규표현식의 활용

1. 컴파일러의 파서

2. CLI 환경을 주로 사용하는 경우, grep, sed, awk를 통해 쓰임

3. 이메일, 주소, 전화번호 규칙 검증

4. 입력에서 불필요한 입력검증

5. 개발도구에서 문자열 치환

6. 로깅에서 찾아볼 때

7. 코딩테스트

 

Intellij는 정규표현식 문자열 치환을 지원함

Mac : command + r

Window : Ctrl + r

 

인덱스 이름 앞에 idx+를 넣어주고 싶다면?

패턴

 


3. Java에서 정규표현식의 활용

1. 문자열에서 알파벳 대문자, 숫자, 더하기(+), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거하라

2. 문자열에서 마침표가(.)가 3번 이상 연속된 부분을 하나의 마침표(.)로 치환하라

정규표현식 활용

여기서 성능상의 이점을 살리기 위해 , String의 replaceAll을 사용할 때, Pattern을 정적으로 만들면 좋음

패턴을 정적으로 만듦

 

Pattern 객체는 불변객체

 

 

Matcher 클래스 사용 시 주의할 점

- Matcher 객체는 reset()하고 다시 input을 넣어 재사용해줄 수 있지만 Thread-safe하지 못함

- Thread-safe 하게 사용하려면 Pattern 객체의 matcher()를 통해 Matcher를 생성한 뒤 사용하면 됨

 

Matcher 클래스 사용 시 주의할 점

 

 

정규표현식을 어떻게 학습하면 좋을까?

- 정규표현식의 현실. 21년 차 개발자도 모든 정규표현식을 외우고 있지 않다고 함

- 알고리즘처럼 감을 잃지 않도록 하는게 중요하다고 생각

- IDE에서 문자열을 replace할 일이 있을 때 정규표현식을 사용해 연습

- 혹시나 정규표현식을 마주했다면 분석해봄

 

정규표현식을 테코톡 요약

1. 클린코드를 위해 정규표현식을 사용할 때는 고민하고 사용

2. 정규표현식을 분석하는데 핵심은 메타문자와 수량자 파악

3. JAVA에서 정규표현식을 사용할 때는 Pattern은 변하지 않으므로 정적으로 만듦

4. JAVA의 Matcher 객체는 Thread safe하지 못함, 멀티스레드 환경이라면 Pattern의 matcher()를 사용

5. 정규표현식은 그때 그때 알아보면서 공부

 

 

 

 

출처 : https://youtu.be/CjoDIgDOHA4