Search

Java와 정규 표현식

Tags
Java
Date
2023/12/17

개요

우아한 프리코스를 진행하면서 배웠던 새로운 개념 중 하나는 정규 표현식입니다. 사실 정규 표현식이라는 정의 자체는 학부 전공에서 배울 수 있었는데요, 해당 표현식이 눈에 잘 익지 않다 보니 막상 프로그래밍을 할 때는 사용하지 않았습니다.
이번 포스팅에서는 정규 표현식과 이를 어떻게 코드에 녹여냈는지 작성해보고자 합니다.

정규 표현식이란

정규 표현식(正規表現式, 영어: regular expression, 간단히 regexp 또는 regex, rational expression)또는 정규식(正規式)은 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어이다.
위키 백과의 정의를 가져와봤습니다.
감이 잘 안오시나요? 쉽게 말하면 어떤 언어의 규칙을 짧막한 한 줄로 표현한 것이 정규 표현식입니다.

정규 표현식 표현 방법

정규표현식
설명
^
문자열 시작
$
문자열 종료
.
임의의 한 문자(단 \은 넣을 수 없음)
*
앞 문자가 없을 수도 무한정 많을 수도 있음
+
앞 문자가 하나 이상
?
앞 문자가 없거나 하나 있음
[ ]
문자의 집합이나 범위를 나타내며 두 문자 사이는 - 기호로 범위를 나타냅니다. [] 내에서 ^ 가 선행하여 존재하면 not을 나타낸다.
{ }
횟수 또는 범위를 나타냅니다.
( )
소괄호 안의 문자를 하나의 문자로 인식
패턴 안에서 or 연산을 수행할 때 사용
\
정규 표현식 역슬래시()는 확장문자 (역슬래시 다음에 일반 문자가 오면 특수문자로 취급하고 역슬래시 다음에 특수문자가 오면 그 문자 자체를 의미)
\b
단어의 경계

정규 표현식 예제

예제로 정규 표현식을 살펴볼까요?
다음과 같은 조건이 있다고 가정해봅시다.
게임에 참가할 학생들의 이름을 입력해주세요. 입력은 , 로 구분합니다. 단, 학생의 이름은 영어와 한글로 제한합니다.
import java.util.regex.Matcher; import java.util.regex.Pattern; public class Main { private final static String pattern = "^[a-zA-Z가-힣]+(?:, [a-zA-Z가-힣]+)*$"; public static void main(String[] args) { String inputString = Console.readLine(); Pattern pattern = Pattern.compile(pattern); Matcher matcher = pattern.matcher(inputString); if (matcher.matches()) { System.out.println("입력에 성공했습니다."); } else { System.out.println("유효하지 않은 입력입니다."); } } }
Java
복사
하나씩 세분화 해볼까요?
우선 정규 표현식은 다음과 같이 표현 가능합니다.
// 숫자만 String regex = ^[0-9]*$; // 영어만 String regex = ^[a-zA-Z]*$; // 한글만 String regex = "^[ㄱ-ㅎ|ㅏ-ㅣ|가-힣\\s]*$"; // 영어 한글만 String regex = "^[a-zA-Z가-힣]+(?:, [a-zA-Z가-힣]+)*$";
Java
복사
matches() 사용
하지만 아직 정규 표현식 만으로는 검증을 진행할 수 없습니다. matches() 메소드를 사용하여 정규 표현식을 통한 검증이 가능합니다.
String regex = "^[ㄱ-ㅎ|ㅏ-ㅣ|가-힣\\s]*$"; String code = " 이거 코드가 아니에요"; // 공백 처리 \p{Z} 또는 \p{Separator}: 모든 종류의 공백 또는 보이지 않는 구분 기호. String reusltCode = code.replaceAll("\\p{Z}", ""); if(reusltCode.matches(regex)){ System.out.println("true"); } else { System.out.println("false"); }
Java
복사
matches() 는 String과 함께 사용할 수 있습니다.
[가-힣]는 한글 자모음을 조합하여 만들어낼 수 있는 모든 한글을 의미합니다.
+는 한글이 하나 이상 반복됨을 의미합니다.
.*는 한 글자 또는 문자열합니ㅏㄷ.

Pattern

정규 표현식, matches()랑 가장 연관 깊은 클래스는 Pattern입니다. Pattern은자바에서 정규표현식을 사용할 때 많이 사용하는 클래스로, 패턴 매치로 matches(), complie() 메서드를 가지고 있습니다.
Pattern 의 matches() 메서드
String regex = "^[ㄱ-ㅎ|ㅏ-ㅣ|가-힣\\s]*$"; boolean checkHangle = Pattern.matches(regex, s);
Java
복사
Pattern 의 compile() 메서드
Pattern pattern = Pattern.compile(regex);
Java
복사