본문 바로가기
Language/java

[Java] 유용한 클래스(정규식 - java.util.regex 패키지)

by gamxong 2022. 7. 14.

정규식이란?

: 텍스트 데이터 중에서 원하는 조건과 일치하는 문자열을 찾아내기 위해 사용하는 것

 

 

import java.util.regex.*;

public class test {
	public static void main(String args[]) {
			String[] data = {"bat","baby","bonus","cA","ca","co","c.",
							"c0","car","combat","count","date","disc"};
			
			Pattern p = Pattern.compile("c[a-z]*");
			
			for(int i=0; i<data.length; i++) {
				Matcher m = p.matcher(data[i]);
				if(m.matches())
					System.out.print(data[i]+",");
			}
		}
}

 

Pattern

: 정규식을 정의하는데 사용

 

Matcher

: 정규식(패턴)을 데이터와 비교하는 역할

 

 

1. 정규식을 매개변수로 Pattern클래스의 static메서드인 Pattern compile(String regex)을 호출하여 Pattern인스턴스를 얻는다.
 Pattern p = Pattern.compile("c[a-z]*");

2. 정규식으로 비교할 대상을 매개변수로 Pattern클래스의 Matcher matcher(CharSequence input)를 호출해서 Matcher인스턴스를 얻는다.
 Matcher m = p.matcher(data[i]);

3. Matcher인스턴스에 boolean matches()를 호출해서 정규식에 부합하는지 확인한다.
 if(m.matches())

 

 

정규식 패턴 설명
c[a-z]* c로 시작하는 영단어
c[a-z] c로 시작하는 두 자리 영단어
c[a-zA-Z] c로 시작하는 두 자리 영단어(대소문자 구분 X)
.* 모든 문자열
c. c로 시작하는 두 자리
[b|c].*
[bc].*
[b-c].*
b 또는 c로 시작하는 문자열

- 이 외 등등 여러 패턴이 있다. p.507

 

 

★ 정규식의 일부를 괄호로 나누어 묶어서 그룹화할 수 있다.

String pattern = "(0\\d{1,2})-(\\d{3,4})-(\\d{4})";

 

 

find()

: 주어진 소스 내에서 패턴과 일치하는 부분을 찾아내면 true를 반환

: find()를 호출해서 패턴과 일치하는 부분을 찾아낸 다음, 다시 호출하면 이전에 발견한 패턴과 일치하는 부분의 다음부터 다시 패턴매칭 시작

 

 

import java.util.regex.*;

class RegularEx4{
	public static void main(String[] args) {
    	String source = "A broken hand works, but not a broken heart.";
        String pattern = "broken";
        StringBuffer sb = new StringBuffer();
        
        Pattern p = Pattern.compile(pattern);
        Matcher m = p.matcher(source);
        System.out.println("source:"+source);
        
        int i=0;
        
        while(m.find()) {
        	System.out.println(++i + "번째 매칭: "+ m.start() + "~" + m.end());
               // broken을 drunken으로 치환하여 sb에 저장
            m.appendReplacement(sb,"drunken");
        }
        
        m.appendTail(sb);
        System.out.println("Replacement count : "+i);
        System.out.println("result: "+sb.toString());
     }
}

/* result
...
1번째 매칭:2~8
2번째 매칭:31~37
...
result: A druken hand works, but not a drunken heart.

 

댓글