IT/Knowledge

정규 표현식 정리(Regex)

성준하이 2022. 9. 19. 10:27
반응형

정규표현식은 사용을 할때마다 검색하는것 같아서 이참에 직접 정리를 해보려고 포스팅을 작성해본다.

 

 

정규표현식에서 사용되는 기호를 Meta 문자라고 하는데 표현식에서 내부적으로 특정 의미를 갖는 문자를 말하며 아래와 같다.

 표현식
의미 
 ^x
 문자열의 시작을 표현하며 x 문자로 시작됨을 의미한다.
x$
 문자열의 종료를 표현하며 x 문자로 종료됨을 의미한다.
 .x
 임의의 한 문자의 자리수를 표현하며 문자열이 x 로 끝난다는 것을 의미한다.
 x+
 반복을 표현하며 x 문자가 한번 이상 반복됨을 의미한다.
 x?
 존재여부를 표현하며 x 문자가 존재할 수도, 존재하지 않을 수도 있음을 의미한다.
 x*
 반복여부를 표현하며 x 문자가 0번 또는 그 이상 반복됨을 의미한다.
 x|y
 or 를 표현하며 x 또는 y 문자가 존재함을 의미한다.
 (x)
그룹을 표현하며 x 를 그룹으로 처리함을 의미한다.
 (x)(y)
그룹들의 집합을 표현하며 앞에서 부터 순서대로 번호를 부여하여 관리하고 x, y 는 각 그룹의 데이터로 관리된다.
 (x)(?:y)
그룹들의 집합에 대한 예외를 표현하며 그룹 집합으로 관리되지 않음을 의미한다. 
 x{n}
 반복을 표현하며 x 문자가 n번 반복됨을 의미한다.
 x{n,}
 반복을 표현하며 x 문자가 n번 이상 반복됨을 의미한다.
 x{n,m}
 반복을 표현하며 x 문자가 최소 n번 이상 최대 m 번 이하로 반복됨을 의미한다.

Meta 문자들 중에서 좀 더 특수하게 사용되는 문자들이 존재하는데 '[]' 는 내부에 지정된 문자열의 범위 중에서 한 문자만을 선택하다는 특수한 의미를 가진다.

그리고 내부에서 Meta문자를 사용하면 다른 의미를 가지고 동작할 수 있으므로 잘 확인하고 사용해야 한다.

 표현식
의미 
[xy]
문자 선택을 표현하며 x 와 y 중에 하나를 의미한다.
 [^xy]
not 을 표현하며  x 및 y 를 제외한 문자를 의미한다.
 [x-z]
range를 표현하며 x ~ z 사이의 문자를 의미한다. 
 \^
escape 를 표현하며 ^ 를 문자로 사용함을 의미한다.
 \b
word boundary를 표현하며 문자와 공백사이의 문자를 의미한다.
 \B
non word boundary를 표현하며 문자와 공백사이가 아닌 문자를 의미한다.
 \d
digit 를 표현하며 숫자를 의미한다. 
 \D
non digit 를 표현하며 숫자가 아닌 것을 의미한다. 
 \s
space 를 표현하며 공백 문자를 의미한다. 
 \S
non space를 표현하며 공백 문자가 아닌 것을 의미한다.
 \t
tab 을 표현하며 탭 문자를 의미한다.
 \v
vertical tab을 표현하며 수직 탭(?) 문자를 의미한다.
 \w
word 를 표현하며 알파벳 + 숫자 + _ 중의 한 문자임을 의미한다. 
 \W
non word를 표현하며 알파벳 + 숫자 + _ 가 아닌 문자를 의미한다. 

그리고 정규표현식에서는 Flag가 존재하는데 이걸 사용하지 않으면 한번만 처리하게 된다.

 Flag
의미 
 g
Global 의 표현하며 대상 문자열내에 모든 패턴들을 검색하는 것을 의미한다. 
 i
Ignore case 를 표현하며 대상 문자열에 대해서 대/소문자를 식별하지 않는 것을 의미한다.
 m
Multi line을 표현하며 대상 문자열이 다중 라인의 문자열인 경우에도 검색하는 것을 의미한다

 

 

사용예제

개별 숫자 - /[0-9]/g

전체에서  0~9사이에 아무 숫자 '하나'  찾음 

개발 문자 - /[to]/g

전체에서 t  혹은 o  를 모두 찾음 

단어 - /filter/g

전체에서  f 따로 i 따로 찾는게 아니라 'filter' 라는 단어에 매칭되는것을 찾음 

단어 제외 - /\b(?:(?!to)\w)+\b/g

전체에서 'to' 라는 단어를 빼고 다른 단어 매칭 /  확인결과 "Tutorial" 도 제외됨. 

단어 제외 - \b(?!\bto\b)\w+\b

전체에서 'to' 라는 단어를 빼고 다른 단어 매칭 /  확인결과 "Tutorial" 는 제외 안됨.  이게 더 정확하다고 볼수있을듯. 

 

\b        # assert at a word boundary (?!       # look ahead and assert that what follows IS NOT...    \b      #   a word boundary   word    #   followed by the exact characters `word`   \b      #   followed by a word boundary )         # end look-ahead assertion \w+       # match one or more word characters: `[a-zA-Z0-9_]` \b        # then a word boundary

이메일 - /^[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*\.[a-zA-Z]{2,3}$/i

'시작을'  0~9 사이 숫자 or a-z A-Z 알바펫 아무거나로 시작하고  /  중간에 - _  . 같은 문자가 있을수도 있고 없을수도 있으며 / 

그 후에 0~9 사이 숫자 or a-z A-Z 알바펫중 하나의 문자가 없거나 연달아 나올수 있으며 /  @ 가 반드시 존재하고  / 

0-9a-zA-Z 여기서 하나가 있고  /  중간에 - _  . 같은 문자가 있을수도 있고 없을수도 있으며 / 그 후에 0~9 사이 숫자 or a-z A-Z 알바펫중 하나의 

문자가 없거나 연달아 나올수 있으며 /  반드시  .  이 존재하고  / [a-zA-Z] 의 문자가 2개나 3개가 존재 /   이 모든것은 대소문자 구분안함 

전화번호 - /^\d{3}-\d{3,4}-\d{4}$/

시작을 숫자 3개로하며 /   중간에 하이픈 -  하나 존재 /  숫자가 3~4개 존재하며 /  하이픈 하나 존재 /  숫자 4개로 끝남 

핸드폰 번호 - /^01([0|1|6|7|8|9]?)-?([0-9]{3,4})-?([0-9]{4})$/

시작을 숫자 01로 시작하며 그 후에 0,1,6,7,8,9 중에 하나가 나올수도 있으며 /  하이픈 - 하나 존재할수도 있으며 /  숫자 3~4개 이어지고 / 

또 하이픈 - 하나 존재할수도 있으며 /  숫자 4개가 이어짐 

URL - ^(https?):\/\/([^:\/\s]+)(:([^\/]*))?((\/[^\s/\/]+)*)?\/?([^#\s\?]*)(\?([^#\s]*))?(#(\w*))?$

^(https?):\/\/

([^:\/\s]+)

(:([^\/]*))?

 

((\/[^\s/\/]+)*)?\/?([^#\s\?]*)(\?([^#\s]*))?(#(\w*))?$

 

공백 관련(24.04.27추가)

- Remove Space (스페이스 공백 제거)
String str = "공백 공백 공백".replaceAll("\\p{Z}", "");
 
- Remove Tab (탭 제거)
String str = "탭  탭 탭".replaceAll("\\t", "");
 
- Remove Enter (개행문자 제거)
String str = "엔터를 제거 
해라".replaceAll("(\r\n|\r|\n|\n\r)", "");
 
- Remove All Whitespace
String str = "공백 공백 탭 탭 엔
터".replaceAll("(\r\n|\r|\n|\n\r|\\p{Z}|\\t)", "");

반응형