(Regex를 검색하니 이런 이미지가 나와서 너무 귀여워서 가져왔당!
외계어같은 정규표현식 히히)
오늘은 코딩테스트를 하다가
[^0-9]이라는 처음보는 정규식을 배웠다.
일단 저 위의 정규식의 뜻은
0과 9사이의 숫자가 아닌 것이란 뜻이다.
하지만 ^이 문자는 분명 정규표현식의 시작을 알리는 거였는데?!
라는 생각에 바로 구글링을 해보았다.
원래 내가 알던 정규표현식은 이메일이나 주민번호 형식검사를 할 때,
구글링해서 Patter.matches()안에 넣는 형식이었는데
이렇게 코테를 볼 때도 저렇게 쉽게 쓸 수 있는 형식이 있다는 것을 알게 되었다.
그래서 정규표현식에 대해 제대로 정리해보려고 한다!
일단 이 표는 보통의 정규표현식을 쓴다고 할 때의
표현식의 문자가 가지는 의미이다!
표현식 | 의미 |
^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를 표현하며 알파벳 + 숫자 + _가 아닌 문자를 의미한다. |
그래서 오늘 코딩 문제처럼
문자열에서 알파벳을 제외한 모든 숫자와 특수기호들을 빼버리고 싶을땐
replaceAll("[^a-z]", "")를 써주면 알파벳(소문자)만 남게된다!
완전 편리!
특수기호 하나에도 뜻이 확 바뀌어버리니 주의해서 잘써봐야겠다~
배움이 즐거운 나날들이다!
+ 보너스) 자주 쓰는 정규표현식
숫자 모양에 대한 형식 검사
"^[0-9]*$"
영문으로만 구성되었는지에 대한 형식 검사
"^[a-zA-Z]*$"
한글로만 구성되었는지에 대한 형식 검사
"^[ㄱ-ㅎ가-힣]*$"
영문과 숫자로만 구성되었는지에 대한 형식 검사
"^[a-zA-Z0-9]*$"
한글과 숫자로만 구성되었는지에 대한 형식 검사
"^[ㄱ-ㅎ가-힣0-9]*$"
이메일 형식인지에 대한 검사. "아이디@도메인"의 형식을 충족해야 한다.
"[0-9a-zA-Z]+(.[_a-z0-9-]+)*@(?:\\w+\\.)+\\w+$"
"-"없이 핸드폰번호인지에 대한 형식검사.
"^01(?:0|1|[6-9])(?:\\d{3}|\\d{4})\\d{4}$"
"-"없이 전화번호인지에 대한 형식검사. 각 부분에 대한 자리수도 충족시켜야 한다.
"^\\d{2,3}\\d{3,4}\\d{4}$"
"-"없이 주민번호에 대한 글자수 및 뒷자리 첫글자가 1~4의 범위에 있는지에 대한 검사
"^\\d{6}[1-4]\\d{6}"
참고사이트:
https://hamait.tistory.com/342
https://highcode.tistory.com/6
'JAVA' 카테고리의 다른 글
[javadoc] Java 주석처리 하는 법(+javodoc 사용법, 양식 총 정리) (1) | 2021.10.25 |
---|---|
[자바 템플릿엔진] jsp는 이제 안녕? thymeleaf란? (0) | 2021.10.22 |
[JAVA, 자료구조] Array(배열)와 List(리스트)의 차이(+그리고 ArrayList는?) (0) | 2021.10.06 |
[JAVA] 비전공자가 알려주는 객체지향이란?(+클래스,추상화,객체 개념정리) (0) | 2021.09.17 |
[JAVA] 자바 public static void main (String args) 뜻은? (0) | 2021.09.09 |