프로그래밍 공부/Java

[Regex] 정규식이란?

1. Regex, 왜 필요하지?

 

프리코스 3주차에서도 Regex와 관련된 포스팅을 한 적이 있는데, (그때는 배웠던 내용중의 일부로 넣었었다.) 이번에도 피드백을 받는 과정에서 정규식과 관련된 이야기들이 나와서, 정규식을 조금 더 정리해보려고 한다

 

실제로도 값을 검증할때 많이 사용된다는 정규식!

 

정규식에서 입력받는 부분등에 있어 늘 if문으로 처리하면 조건이 까다롭고, 엄청나게 많은 if문이 필요하게 된다.

이런 상황에서 효과적으로 사용할 수 있는 것이 바로 regex,  정규표현식이다.

 

 

2. Regex란?

정규 표현식은 줄여서 정규식이라고도 하며, 영어로는 Regular Expression, 줄여서 regex, regexp라고도 한다.
초반에는 편집기의 패턴매칭을 시작으로 사용되었으며, 수학적인 의미에서 시작되었다고 하며, 
특정한 규칙을 가진 문자열의 집합을 표현하기 위해 쓰이는 형식언어이다.

 

Regex에서는 다음과 같은 방식으로 패턴을 사전에 정의하게 된다.

이런식으로 입력을 넣을 것이다, 라고 미리 선언을 한 뒤 확인하는 방식으로 진행된다.

 

 

정규표현식은 메타문자 수량자로 구성된다. 

 

 

아래에 첨부된 빙봉의 정규표현식 (테코톡) 자료

 

 

* 표의 일부가 다크테마에서는 잘 보이지 않습니다... ㅠㅠ

** 화이트 배경으로 두고 봐주세요! 

 

Regular Expression Description
^ 문자열의 시작
$ 문자열의 끝
. 임의의 한 문자
* 문자가 0번 이상 발생 ( = {0,})
+ 문자가 1번 이상 발생 ( = {1,})
? 문자가 0번 혹은 1번 발생 ( = {0, 1})
[ ]  문자의 집합 범위를 나타냄

[0-9] : 숫자 (0부터 9)
[a-z] : 알파벳 (a부터 z)

앞에 ^가 나타나면 not을 의미
{ }  횟수 또는 범위를 의미

{n} : 앞 문자가 n개
{n,} 앞문자가 n개 이상
{n, m}: 앞 문자가 n개 이상, m개 이하
( )  소괄호 안의 문자를 하나의 문자로 인식
|  or 조건
\ 확장 문자의 시작 
\b 단어의 경계
\B 단어가 아닌 것의 경계
\A 입력의 시작부분
\G 이전 매치의 끝
\Z 입력의 끝이지만 종결자가 있는 경우
\z 입력의 끝
\s 공백문자
\S 공백문자가 아닌 나머지 문자
\w 알파벳이나 숫자
\W 알파벳이나 숫자를 제외한 문자
\d [0-9]와 동일
\D 숫자를 제외한 모든 문자

 

예시

^[0-9]*$ 숫자
^[a-zA-Z]*$ 영문자
^[가-힣]*$ 한글
\\w+@\\w+\\.\\w+(\\.\\w+)? 이메일 주소
^\d{2,3}-\d{3,4}-\d{4}$ 전화번호
^01(?:0|1|[6-9])-(?:\d{3}|\d{4})-\d{4}$ 핸드폰 번호
\d{6} \- [1-4]\d{6} 주민등록 번호
^\d{3}-\d{2}$ 우편번호

 

자바 문자열 객체에서 정규식을 사용할 때, 가장 많이 사용되는 메소드는 다음과 같다. 

 

- boolean matches(String regex)

  인자로 주어진 정규식에 매칭되는 값이 있는지 확인한다.

 

- String replaceAll(String regex, String replacement)

  문자열내에 있는 정규식 regex와 매치되는 모든 문자열을 replacement문자열로 바꾼 문자열을 반환한다.

 

- String[] split(String regex)

  인자로 주어진 정규식과 매치되는 문자열을 구분자로 분할한다

 

 

2.1 항상 정규표현식을 사용하는게 좋은가?

강점: 패턴으로 검증이 가능하다. if문을 많이 안써도 된다.

약점: 가독성이 나쁘다. 유지보수하기 힘들다.

 

그러므로, 간단한 검증일때는 if문으로, 복잡한 검증일때는 정규식으로 하되, 주석을 통해서 가독성을 높이는 것이 필요하다.

 

 

3. 어떻게 활용할까?

정규표현식은 어디에 쓰일까?

  1. 컴파일러의 파서
  2. CLI 환경을 주로 사용하는 경우, grep, sed, awk를 통해 사용
  3. 이메일, 주소, 전화번호 규칙 검증
  4. 불필요한 입력 검증
  5. 개발도구에서 문자열 치환
  6. 로깅에서 찾아볼 때
  7. 코딩테스트

 

사실 정규표현식을 완벽하게 외우는 것은 어렵다고 생각한다.

그렇기때문에 어느정도 이해만 하고 있다가, 그때그때 구글링을 해보거나 (구글링은... 개발자의 숙명...), 만들어보면서 찾아가는게 더 편하지 않을까 싶다. 감을 잃지 않도록!

 

 

페어인 레오가 리뷰어에게 추천받은 아래와 같은 사이트를 최대한 활용해보는 것도 좋은 방법일듯 하다!

 

RegExr: Learn, Build, & Test RegEx

RegExr is an online tool to learn, build, & test Regular Expressions (RegEx / RegExp).

regexr.com

 

 

 

더불어, 레오에게 전해받은 테코톡의 영상까지 덧붙이면서 오늘의 포스팅을 마쳐보려고 한다.

(다만, 해당 영상은 자바스크립트 기준으로 설명이 되고 있으니... 자바와는 조금 다른 부분이 있다는 점에 주의!)

 

우테코에서 배운 내용들을 우테코에서 복습하고... 계속 반복되는 것 같다.

위 동영상의 간단한 요약.

 

 

 

참고자료

https://hbase.tistory.com/160

 

'프로그래밍 공부 > Java' 카테고리의 다른 글

[JAVA] JVM이란?  (0) 2022.03.13
[Java] Stream API  (1) 2022.03.03
[OOP] 객체지향 프로그래밍  (0) 2022.03.02
[JUnit5] 테스트 기초 알아보기  (0) 2022.02.17