[알고리즘] 정규표현식
정규표현식 🧶
정규표현식(Regular Expression)이란?
특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어
정규표현식의 기본패턴
표현식 | 의미 |
---|---|
^ | 문자열의 시작 |
$ | 문자열의 종료 |
. | 줄바꿈을 제외한 임의의 한 문자 |
[..] | [] 사이에 있는 임의의 한 문자 또는 문자 집합 |
[^..] | [] 사이에 있는 임의의 한 문자 또는 문자 집합을 제외 |
\d | 0~9 사이의 숫자, [0-9]와 동일 |
\D | 숫자가 아닌 문자, [ ^0-9]와 동일 |
{X} | X회 이상 반복 |
{X, Y} | X~Y 사이의 수 만틈 반복 |
*? | 가장 적게 일치하는 패턴을 찾음 |
자주 사용되는 정규표현식
정규표현식 | 의미 |
---|---|
^[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}$ | 우편번호 |
정규표현식 사용법
🧶 옛날 과제에서 사용했던 예시를 가져와 봤다.
import java.util.regex.Pattern;
public class example {
public static void main(String[] args) {
String chkPhone ="^01(?:0|1|[6-9])[-](?:\\d{3}|\\d{4})[-]\\d{4}$";
String value = "010-0000-0000";
boolean check = Pattern.matches(chkPhone, value);
System.out.println(check);
}
}
주요 메소드
String.matches(regex): String이 regex와 일치하면 true
String.split(regex): regex와 일치하는 것을 기준으로 String을 분리해 배열로 반환
String.replaceFirst(regex, replace): regex와 가장 먼저 일치하는 것을 replace로 변환
String.replaceAll(regex, replace): regex와 일치하는 모든 것을 replace로 변환
추천 문제
프로그래머스 신규 아이디 추천
이 문제는 내가 지난번에 풀어봤던 문제인데 (코드), 정규표현식을 사용하면 훨씬 간단하게 나타낼 수 있다.
-
2단계: 소문자, 숫자, -, _, . 만 문자열에 넣음
정규표현식 사용 전
for (int i = 0; i < new_id.length(); i++) { char c = new_id.charAt(i); if (Character.isLowerCase(c) || Character.isDigit(c) || c == '-' || c == '_' || c == '.') { tmp += Character.toString(c); } }
정규표현식 사용 후
new_id = new_id.replaceAll("[^-_.a-z0-9]", "");
-
3단계: .이 연속되면 .을 하나로
정규표현식 사용 전 (참고로 모든 테스트 케이스가 통과되지 않는 코드다.)
String check = ""; int idx = 0; for (int i = 0; i < new_id.length()-1; i++) { if (new_id.charAt(i) == '.' && new_id.charAt(i+1) == '.') { idx = i; while (new_id.charAt(idx) == '.') { check += "."; idx++; if (idx == new_id.length()) { break; } } tmp = tmp.replace(check, "."); check = ""; i = idx-1; } }
정규표현식 사용 후
new_id = new_id.replaceAll("[.]{2,}", ".");
-
4단계: 처음이나 끝의 . 제거
정규표현식 사용 전
if (new_id.startsWith(".")) { new_id = new_id.substring(1, new_id.length()); } if (new_id.endsWith(".")) { new_id = new_id.substring(0, new_id.length()-1); }
정규표현식 사용 후
new_id = new_id.replaceAll("^[.]|[.]$", "");