정규표현식 이란 텍스트에서 원하는 조건과 일치하는 문자열을 찾아내거나, 원하는 조건과 텍스트가 일치하는지 참/거짓 여부를 판단하는 등의 상황에 사용된다.
예를 들어, 여러 사람의 집단중 이름이 a로 시작하는 사람들을 찾아내거나, 사용자가 입력한 문자열이 이메일 형식에 맞는지 참/거짓 여부를 판단하는 등이 이에 해당한다.
Java뿐만 아니라 대부분의 언어에서 이 정규표현식을 사용할 수 있도록 지원하고 있으며, 여러 방법을 통해 이를 응용할 수 있다.
이후에 설명하겠지만, java에는 regex라는 패키지가 존재하며, 내부의 Pattern, Matcher 클래스 등을 이용하는 것이 일반적이다.
하지만 단순히 한 문자열 내에서 특정 조건에 부합하는 일부를 다른 문자열로 치환하고 싶다면 해당 패키지의 사용 없이 String.replaceAll 메서드를 사용해도 무방하다.위와 같이, replaceAll()의 구현을 보면, 내부적으로는 Pattern과 Matcher가 쓰이고 있는 것을 확인할 수 있다.
이는 참고로 알아두고, 편하게 사용할 수 있도록 메서드가 제공되어있으니 우리는 이를 이용하자.
예를 들어, 문자열 내에 a가 두번이상 연속된 부분을 하나의 a로 치환하고자 한다. 이러한 경우에는 다음과 같은 방법을 사용할 수 있다. 위와 같이, replaceAll()의 첫 번째 인자로 regex를 지정할 수 있으며, {2,}란 앞의 온 문자 a가 2번 이상 반복되는 경우를 의미하는 정규표현식이다.
그럼, 위의 {2,} 와 같이 정규표현식에서 사용되는 표현식들에는 어떤 것이 있는지 알아보자.
. ^ $ * + ? { } [ ] \ | ( )
위의 기호들은 메타문자로, 정규표현식에서 쓰일경우 특정 의미를 가지는 문자들이다.
각 문자의 의미는 아래와 같다.
.x
: 임의의문자 + x
ex) a.c : abc, a0c ,,
ex) a..c : abbc, a00c ,,
x*
: x의 0번 이상 반복
x+
: x의 1번 이상 반복
^x
: 문자열이 x로 시작
x$
: 문자열이 x로 끝남
x?
: x가 존재할수도, 하지 않을 수도 있음
ex) ab?c : ac, abc 모두 가능
x|y
: x 또는 y
ex) (x|y)z : xy 또는 yz 모두 가능
x{n}
: x의 n번 반복
x{m,n}
: x의 m번 이상 n번 이하 반복
x{n,}
: x의 n번 이상 반복
[xy]
: x 또는 y 한 문자
[x-z]
: x~z 범위 내의 한 문자
[^xy]
: x 또는 y를 제외한 한 문자
ex) [^yz] : a, b, c, ,,, w, x 중 한 문자를 의미
이외에도, 자주 사용되는 표현들은 별도의 표기법이 존재한다.
대표적으로 [0-9] 대신에 \d를, [a-zA-Z0-9_] 대신에 \w를 사용할 수 있다.
처음에는 많이 헷갈릴 수 있어서 이를 다양하게 연습해 보는 것이 중요한데,
아래와 같이 테스트를 해볼 수 있는 사이트가 존재한다.
본인이 테스트로 삼을 Text를 지정할수 있고, 그에 대한 정규식을 입력하면 해당하는 범위들이 모두 표시된다.
동시에 어떠한 정규표현식들이 존재하는지 설명과 함께 나와있어, 연습해보기에 좋을 것 같다.https://regexr.com/
이제 실제로 연습해보기 위해, 정규표현식과 관련된 문제인 카카오 2021 블라인드 테스트의 "신규 아이디 추천"을 풀어보려고 한다.
-> https://velog.io/@minji/2021-%EC%B9%B4%EC%B9%B4%EC%98%A4-%EB%B8%94%EB%9D%BC%EC%9D%B8%EB%93%9C-%EC%8B%A0%EA%B7%9C-%EC%95%84%EC%9D%B4%EB%94%94-%EC%B6%94%EC%B2%9CJava-%EC%A0%95%EA%B7%9C%ED%91%9C%ED%98%84%EC%8B%9D
이후에, 단순 문자열 치환이 아닌 정규표현식에 부합하는지를 판별하거나 여러 문자열들 중 조건에 부합하는 문자열들만을 뽑을 때 사용할 수 있는 regex 패키지에 대해 자세히 알아보자.
감사해욤