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