1. 정규식이란?

문자열 데이터 중에서 원하는 조건과 일치하는 문자열 부분을 찾아 정의하는 표현식으로, 텍스트 검색, 추출, 매칭 등에 매우 유용하게 쓰인다.

  • 이메일, 전화번호와 같은 특정 형식의 데이터 검증
  • 특정 패턴에 맞는 문자열 찾기 및 대체
  • 로그 파일에서 원하는 정보만 추출하기

정규표현식 기호 모음

기호 표현 예시
. 임의의 한 문자 (개행 제외) a.b : acb, a1b
^ 시작을 의미한다.[] 괄호 안에 있다면 일치하지 않는 부정의 의미로 쓰인다. ^a : a로 시작하는 단어
[^a] :  a 아닌 철자 외 문자 1
$ $앞의 문자열로 문자가 끝나는지를 의미한다 a$ : a로 끝나는 단어
[abc] a, b, 또는 c 중 하나 [aeiou] : a, e
[^abc] a, b, c가 아닌 문자 [^a-z] : 알파벳 소문자 a부터 z까지를 제외한 모든 문자
[a-zA-Z] 알파벳 대소문자 [a-zA-Z] → 모든 영문자
\d 숫자 (0-9) \d+ : 숫자 연속
\D 숫자가 아닌 문자 \D+ : 숫자 제외 문자
\w 알파벳 대소문자+숫자+_와 동일 \w+ : [a-zA-Z_0-9]
\W \w의 부정 \W+ : [^a-zA-Z_0-9]
+ 1번 이상 반복 a+ : a, aa, aaa
* 0번 이상 반복 a* : aaa, a, ""(빈문자열) 
? 0번 또는 1번 반복 a? : a, ""(빈문자열)
() 그룹, 캡쳐 (ha)+ : haha , hahaha ...
(?:) 캡쳐하지 않는 그룹 찾지만 그룹에 포함 안
{n} 정확히 n개  a{3} : aaa(o) ...
{n,} n번 이상 반복 a{2} : aa(o) ...
{n,m} n번 이상 m번 이하 반복 a{2,5} : a(x) , aa(o) ... aaaaa(o) 

자주 사용되는 정규식 샘플

정규 표현식 설명
^[0-9]*$ 숫자
^[a-zA-Z]*$ 영문자
^[가-힣]*$ 한글
\\w+@\\w+\\.\\w+(\\.\\w+)? 이메일
^\d{2,3}-\d{3,4}-\d{4}$ 전화번호
^01(?:0|1|[6-9])-\d{3,4}-\d{4}$ 휴대전화번
\d{6} - [1-4]\d{6} 주민등록번호
^\d{3}-\d{2}$ 우편번호

2. Pattern 클래스

Pattern 클래스는 정규식 패턴을 정의하고 컴파일 하는 역할을 한다. 정규식을 매번 해석하는 것은 성능상 비효율적이므로, Pattern 객체를 사용해 정규식을 미리 컴파일해 두면 이후 같은 패턴을 반복적으로 사용할때 좋다.

메서드 설명 예시
Pattern compile(String regex) 주어진 정규표현식(regex) 패턴을 컴파일하여 Pattern 객체를 생성합니다. Pattern pattern = Pattern.compile("\\d+");
Boolean matches(String regex, CharSequence input) 정규표현식(regex)과 입력 문자열(input)이 완전히 일치하는지 검사합니다. 일치하면 true, 그렇지 않으면 false를 반환합니다. boolean result = Pattern.matches("\\d+", "12345"); // true
Predicate<String> asPredicate() 문자열을 일치시키는 데 사용할 수 있는 Predicate<String>을 작성합니다. Predicate<String> predicate = pattern.asPredicate();
String pattern() 컴파일된 정규표현식을 String 형태로 반환합니다. String regex = pattern.pattern();
String[] split(CharSequence input) 입력 문자열(input)을 정규표현식 패턴에 따라 분리하여 문자열 배열로 반환합니다. String[] result = pattern.split("one1two2three");

 

Pattern pattern = Pattern.compile("\\d+");
String[] result = pattern.split("Java8, Java11, Java17");
for (String s : result) {
    System.out.println(s);
}
/*
* 결과
* Java
* , Java
* , Java
*/

3. Matcher 클래스

Matcher 클래스는 Pattern 객체와 문자열을 매칭시켜주는 역할을 한다. Matcher 객체는 Pattern 객체의 matcher() 메서드를 통해 얻을 수 있다. 이 후 매칭된 문자열을 확인하거나 특정 작ㅇ겁을 수행할 수 있다.

메서드 설명 예시
boolean find() 패턴이 일치하는 경우 true를 반환, 불일치하는 경우 false를 반환. 여러 개가 매칭될 경우 반복 실행으로 이어서 매칭됨 boolean result = matcher.find();
boolean(int start) 지정된 start 위치 이후부터 매칭 검색 boolean result = matcher.find(5);
int start() 매칭되는 문자열의 시작 위치 반환 int startPos = matcher.start();
int start(int group) 지정된 그룹이 매칭되는 시작 위치 반환 int startPos = matcher.start(1);
int end() 매칭되는 문자열 끝 위치의 다음 문자 위치 반환 int endPos = matcher.end();
int end(int group) 지정된 그룹이 매칭되는 끝 위치의 다음 문자 위치 반환 int endPos = matcher.end(1);
String group() 매칭된 부분 문자열 반환 String match = matcher.group();
String group(int group) 그룹화된 패턴 중 지정된 group 번째 부분 반환 String match = matcher.group(1);
int groupCount() 괄호로 그룹화된 전체 패턴의 개수 반환 int count = matcher.groupCount();
boolean matches() 패턴이 전체 문자열과 일치할 경우 true 반환 (일부 문자열이 아닌 전체와 일치해야 함) boolean result = matcher.matches();

 

Pattern pattern = Pattern.compile("\\d+");
Matcher matcher = pattern.matcher("Java 8, Java 11, Java 17");

while (matcher.find()) {
	System.out.println("Found: " + matcher.group() + ", Start: " + matcher.start() + ", End: " + matcher.end());
}
        /*
        * 결과
        * Found: 8, Start: 5, End: 6
        * Found: 11, Start: 13, End: 15
        * Found: 17, Start: 22, End: 24
        */

'프리코스 > 1주차' 카테고리의 다른 글

1주차 끝나고  (3) 2024.10.30
Git Commit Message Conventions 정리  (0) 2024.10.24
pr 전 체크리스  (0) 2024.10.18

+ Recent posts