산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> java

자바 정규 표현식: java.util.regex로 패턴 매칭 마스터하기

자바는 정규 표현식을 이용한 패턴 매칭을 위해 java.util.regex 패키지를 제공합니다. 자바 정규 표현식은 펄(Perl) 프로그래밍 언어의 것과 매우 유사하며 배우기 쉽습니다.

정규 표현식이란?

정규 표현식은 특수한 문자 시퀀스로, 패턴에 담긴 특수 구문을 사용하여 다른 문자열이나 문자열 집합을 매칭하거나 찾는 데 도움을 줍니다. 텍스트와 데이터를 검색, 편집, 조작하는 데 사용할 수 있습니다.

java.util.regex 핵심 클래스

java.util.regex 패키지는 주로 다음 세 가지 클래스로 구성됩니다.

캡처 그룹(Capturing Groups)

캡처 그룹은 여러 문자를 하나의 단위로 다루는 방법입니다. 그룹화할 문자를 괄호로 감싸서 생성합니다. 예를 들어, 정규 표현식 (dog)는 "d", "o", "g" 글자를 포함하는 단일 그룹을 만듭니다.

캡처 그룹은 왼쪽에서 오른쪽으로 여는 괄호를 세어 번호가 매겨집니다. 표현식 ((A)(B(C)))의 경우 네 개의 그룹이 있습니다.

표현식에 몇 개의 그룹이 있는지 알아보려면 매처 객체에서 groupCount 메서드를 호출하세요. 이 메서드는 매처 패턴에 존재하는 캡처 그룹의 수를 int로 반환합니다.

또한 특수한 그룹인 그룹 0이 있는데, 이는 항상 전체 표현식을 나타냅니다. 이 그룹은 groupCount가 보고하는 총계에 포함되지 않습니다.

예제: 영숫자 문자열에서 숫자 문자열 찾기

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches {
    public static void main(String args[]) {
        // 패턴을 찾을 대상 문자열
        String line = "This order was placed for QT3000! OK?";
        String pattern = "(.*)(\\d+)(.*)";

        // Pattern 객체 생성
        Pattern r = Pattern.compile(pattern);

        // Matcher 객체 생성
        Matcher m = r.matcher(line);

        if (m.find()) {
            System.out.println("Found value: " + m.group(0));
            System.out.println("Found value: " + m.group(1));
            System.out.println("Found value: " + m.group(2));
        } else {
            System.out.println("NO MATCH");
        }
    }
}

실행 결과

Found value: This order was placed for QT3000! OK?
Found value: This order was placed for QT300
Found value: 0

정규 표현식 구문

자바에서 사용 가능한 모든 정규 표현식 메타문자 구문을 정리한 표입니다.

부분표현식 일치하는 대상
^행의 시작과 일치
$행의 끝과 일치
.개행 문자를 제외한 임의의 단일 문자와 일치. m 옵션 사용 시 개행 문자도 포함
[...]대괄호 안의 임의의 단일 문자와 일치
[^...]대괄호 안에 없는 임의의 단일 문자와 일치
\A문자열 전체의 시작
\z문자열 전체의 끝
\Z문자열 전체의 끝(허용 가능한 마지막 줄 종료 문자 제외)
re*앞의 표현식이 0회 이상 반복
re+앞의 표현식이 1회 이상 반복
re?앞의 표현식이 0회 또는 1회 반복
re{n}앞의 표현식이 정확히 n회 반복
re{n,}앞의 표현식이 n회 이상 반복
re{n,m}앞의 표현식이 n회 이상 m회 이하 반복
a|ba 또는 b와 일치
(re)정규 표현식을 그룹화하고 매치된 텍스트를 기억
(?:re)정규 표현식을 그룹화하되 매치된 텍스트는 기억하지 않음
(?>re)백트래킹 없이 독립적인 패턴과 일치
\w단어 문자(알파벳, 숫자, 밑줄)와 일치
\W비단어 문자와 일치
\s공백 문자(탭, 개행, 캐리지 리턴, 폼피드)와 일치. [\t\n\r\f]와 동일
\S비공백 문자와 일치
\d숫자와 일치. [0-9]와 동일
\D비숫자와 일치
\A문자열의 시작과 일치
\Z문자열의 끝과 일치. 개행이 있으면 개행 직전과 일치
\z문자열의 끝과 일치
\G마지막 매치가 끝난 지점과 일치
\n캡처 그룹 번호 "n"에 대한 역참조
\b대괄호 밖에서는 단어 경계, 안에서는 백스페이스(0x08)와 일치
\B비단어 경계와 일치
\n, \t 등개행, 캐리지 리턴, 탭 등과 일치
\Q\E까지의 모든 문자를 이스케이프(인용)
\E\Q로 시작한 인용 종료

Matcher 클래스 메서드

인덱스 메서드

입력 문자열에서 매치가 발견된 정확한 위치를 보여주는 인덱스 값을 제공합니다.

번호 메서드 및 설명
1public int start() - 이전 매치의 시작 인덱스를 반환
2public int start(int group) - 이전 매치 연산에서 주어진 그룹이 캡처한 부분열의 시작 인덱스를 반환
3public int end() - 매치된 마지막 문자 다음 오프셋을 반환
4public int end(int group) - 이전 매치 연산에서 주어진 그룹이 캡처한 부분열의 마지막 문자 다음 오프셋을 반환

검사 메서드(Study Methods)

입력 문자열을 검토하여 패턴이 발견되었는지 여부를 불리언으로 반환합니다.

번호 메서드 및 설명
1public boolean lookingAt() - 영역의 시작부터 입력 시퀀스를 패턴과 매치 시도
2public boolean find() - 패턴과 매치되는 입력 시퀀스의 다음 부분열을 찾으려 시도
3public boolean find(int start) - 이 매처를 리셋하고 지정된 인덱스부터 패턴과 매치되는 다음 부분열을 찾으려 시도
4public boolean matches() - 전체 영역을 패턴과 매치 시도

치환 메서드(Replacement Methods)

입력 문자열의 텍스트를 치환하는 데 유용한 메서드들입니다.

번호 메서드 및 설명
1public Matcher appendReplacement(StringBuffer sb, String replacement) - 비종단적 추가-치환 단계를 구현
2public StringBuffer appendTail(StringBuffer sb) - 종단적 추가-치환 단계를 구현
3public String replaceAll(String replacement) - 패턴과 매치되는 입력 시퀀스의 모든 부분열을 주어진 치환 문자열로 대체
4public String replaceFirst(String replacement) - 패턴과 매치되는 입력 시퀀스의 첫 번째 부분열을 주어진 치환 문자열로 대체
5public static String quoteReplacement(String s) - 지정된 문자열에 대한 리터럴 치환 문자열을 반환. Matcher 클래스의 appendReplacement 메서드에서 리터럴 치환 s로 작동할 문자열 생성

start와 end 메서드 예제

입력 문자열에서 "cat" 단어가 나타나는 횟수를 세는 예제입니다.

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches {
    private static final String REGEX = "\\bcat\\b";
    private static final String INPUT = "cat cat cat cattie cat";

    public static void main(String args[]) {
        Pattern p = Pattern.compile(REGEX);
        Matcher m = p.matcher(INPUT);
        int count = 0;

        while (m.find()) {
            count++;
            System.out.println("Match number " + count);
            System.out.println("start(): " + m.start());
            System.out.println("end(): " + m.end());
        }
    }
}

실행 결과

Match number 1 start(): 0 end(): 3
Match number 2 start(): 4 end(): 7
Match number 3 start(): 8 end(): 11
Match number 4 start(): 19 end(): 22

이 예제는 단어 경계(\b)를 사용하여 "c", "a", "t" 글자가 더 긴 단어의 부분 문자열이 아님을 보장합니다. 또한 입력 문자열에서 매치가 발생한 위치에 대한 유용한 정보를 제공합니다.

start 메서드는 이전 매치 연산에서 주어진 그룹이 캡처한 부분열의 시작 인덱스를 반환하고, end는 매치된 마지막 문자의 인덱스에 1을 더한 값을 반환합니다.

matches와 lookingAt 메서드

matches와 lookingAt 메서드 모두 입력 시퀀스를 패턴과 매치하려 시도합니다. 차이점은 matches는 전체 입력 시퀀스가 매치되어야 하는 반면, lookingAt은 그렇지 않다는 것입니다.

두 메서드 모두 항상 입력 문자열의 시작부터 시작합니다. 기능을 설명하는 예제입니다.

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches {
    private static final String REGEX = "foo";
    private static final String INPUT = "fooooooooooooooooo";
    private static Pattern pattern;
    private static Matcher matcher;

    public static void main(String args[]) {
        pattern = Pattern.compile(REGEX);
        matcher = pattern.matcher(INPUT);
        System.out.println("Current REGEX is: " + REGEX);
        System.out.println("Current INPUT is: " + INPUT);
        System.out.println("lookingAt(): " + matcher.lookingAt());
        System.out.println("matches(): " + matcher.matches());
    }
}

실행 결과

Current REGEX is: foo
Current INPUT is: fooooooooooooooooo
lookingAt(): true
matches(): false

replaceFirst와 replaceAll 메서드

replaceFirst와 replaceAll 메서드는 주어진 정규 표현식과 매치되는 텍스트를 치환합니다. 이름에서 알 수 있듯 replaceFirst는 첫 번째 발생만, replaceAll은 모든 발생을 치환합니다.

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches {
    private static String REGEX = "dog";
    private static String INPUT = "The dog says meow. " + "All dogs say meow.";
    private static String REPLACE = "cat";

    public static void main(String[] args) {
        Pattern p = Pattern.compile(REGEX);
        Matcher m = p.matcher(INPUT);
        INPUT = m.replaceAll(REPLACE);
        System.out.println(INPUT);
    }
}

실행 결과

The cat says meow. All cats say meow.

appendReplacement와 appendTail 메서드

Matcher 클래스는 텍스트 치환을 위한 appendReplacement와 appendTail 메서드도 제공합니다.

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches {
    private static String REGEX = "a*b";
    private static String INPUT = "aabfooaabfooabfoob";
    private static String REPLACE = "-";

    public static void main(String[] args) {
        Pattern p = Pattern.compile(REGEX);
        Matcher m = p.matcher(INPUT);
        StringBuffer sb = new StringBuffer();

        while (m.find()) {
            m.appendReplacement(sb, REPLACE);
        }
        m.appendTail(sb);
        System.out.println(sb.toString());
    }
}

실행 결과

-foo-foo-foo-

PatternSyntaxException 클래스 메서드

PatternSyntaxException은 정규 표현식 패턴의 구문 오류를 나타내는 언체크 예외입니다. 이 클래스는 무엇이 잘못되었는지 파악하는 데 도움이 되는 다음 메서드들을 제공합니다.

번호 메서드 및 설명
1public String getDescription() - 오류 설명을 가져옴
2public int getIndex() - 오류 인덱스를 가져옴
3public String getPattern() - 잘못된 정규 표현식 패턴을 가져옴
4public String getMessage() - 구문 오류 설명, 인덱스, 잘못된 패턴, 패턴 내 오류 인덱스 시각적 표시를 포함한 여러 줄 문자열 반환

java

  1. C# 식, 문, 블록: 개념과 실전 예제로 완벽 이해
  2. Java 연산자 마스터하기: 종류, 문법, 실전 예제
  3. Java 표현식, 문장, 블록 이해하기
  4. Java 주석: 종류, 사용법, 모범 사례
  5. Java 향상된 for 루프(for-each) 완벽 가이드: 문법, 예제, 비교
  6. Java String 마스터하기: 생성, 메서드, 모범 사례
  7. Java 인터페이스 마스터: 개념, 구현, 모범 사례
  8. Java Try-with-Resources 마스터: 자동 리소스 관리 완전 해설
  9. Java 애너테이션 완전 해설: 종류, 배치 위치, 실전 예제
  10. Java Assertion(어설션) 실전 가이드: 버그 조기 발견과 코드 신뢰성 확보