일단 시작해보는 블로그

[Java] 자바의 정규표현식을 위한 Pattern, Matcher 본문

개발/Java

[Java] 자바의 정규표현식을 위한 Pattern, Matcher

Selina Park 2019. 9. 3. 11:21

문자열로 정의한 정규표현식은 사용되기 전에 반드시 Pattern 클래스의 인스턴스로 컴파일 되어야한다.

컴파일된 패턴은 Matcher 객체를 만드는데 사용되며, Matcher 객체는 임의의 입력 문자열이 패턴에 부합되는지 여부를 판가름하는 기능을 담당한다. 또한, Pattern객체들은 비상태 유지 객체들이기 때문에 여러개의 Matcher 객체들이 공유할 수 있다.

 

목표> String str = "나는 123456788입니다."; 다음 문자열에서 숫자만 추출하고 싶어요!

 

1. Pattern p = Pattern.compile("([0-9])+");

 

여기서 [0-9]라고 하면 숫자 한글자씩 나온다. ([]이거 자체가 범위를 쓸 수 있지만 한 글자를 의미하는 것이라서 그렇다.)

원하는 답(123456788)을 출력하기 위해서는 그룹핑하는 괄호 ()안에 [0-9]가 0개 혹은 한개 이상 쓰일 수 있다고 표시를 해줘야한다,

주어진 정규식으로 패턴을 만든다(이 과정을 complie이라고 한다.). 이건 다음 단계에서 쓰일 Matcher객체에 사용된다.

 

2. Matcher mStr = p.matcher(str);

찾으려는 문자열을 패턴과 일치하는지에 관한 정보를 담은 객체를 생성한다.

 

3. while(mStr.find()) { ... }

mStr.find() == true일 때, 즉 우리가 구하려는 패턴을 찾았을 때이다.

출력을 하든, mStr.group()을 이용하여 해당 문자열을 반환하던, count를 하던 이 곳에서 해주면 된다.

 

 

** Matcher 클래스 메서드 **

find()

주어진 텍스트에서 Pattern에 일치하는 텍스트들이 발견되면 true를 반환해줌.

if(mStr.find()) {  ... } -> if문 안에 쓰게 되면 당연히 첫번째만 반환할 수 있다.

while(mStr.find()) { ... } -> 전체를 가져오고 싶다면 이렇게 loop를 통해서 가져와야한다. 이때 List에 담거나 배열에 담으면 될것.

 

start()

일치한 텍스트의 시작 index값을 넘겨준다.

 

end()

일치한 텍스트의 마지막 index값을 넘겨준다.

 

group()

주어진 텍스트에서 주어진 패턴과 일치하는 텍스트를 반환해준다.

 

match()

주어진 텍스트 전체와 Pattern이 일치하는 경우 true를 반환해준다.

 

 

 

package java_library_prac;

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


public class Pattern_Matcher {
    public static void main(String[] args) {
        // Pattern 객체의 compile 메서드는 주어진 정규식으로부터 패턴을 만들어낸다. 이를 컴파일한다고 한다.

        //<meta property="og:url" content="https://b.com"/> 와 같은 문자열 추출
        Pattern URL_PATTERN = Pattern.compile("<meta property=\"og:url\" content=\"(.+?)\"/>");
        //<a href="https://a.com">
        Pattern EXTERNAL_LINK = Pattern.compile("<a href=\"https://(.+?)\">");

        String page = "<html lang=\"ko\" xml:lang=\"ko\" xmlns=\"http://www.w3.org/1999/xhtml\">\n" +
                "<head>\n" +
                "  <meta charset=\"utf-8\">\n" +
                "  <meta property=\"og:url\" content=\"https://b.com\"/>\n" +
                "  <meta property=\"og:url\" content=\"https://a.com\"/>\n" +
                "</head>  \n" +
                "<body>\n" +
                "Suspendisse potenti. Vivamus venenatis tellus non turpis bibendum, \n" +
                "<a href=\"https://a.com\"> Link to a </a>\n" +
                "blind sed congue urna varius. Suspendisse feugiat nisl ligula, quis malesuada felis hendrerit ut.\n" +
                "<a href=\"https://c.com\"> Link to c </a>\n" +
                "</body>\n" +
                "</html>";


        // matches메서드 : 주어진 패턴과 일치하면 true, 아니면 false를 반환한다.

        // Matcher class
        
        Matcher url_Matcher = URL_PATTERN.matcher(page);
        while(url_Matcher.find()){
            System.out.println(url_Matcher.group());
        }
        // <meta property="og:url" content="https://b.com"/>
		// <meta property="og:url" content="https://a.com"/>



        Matcher external_mMatcher = EXTERNAL_LINK.matcher(page);
        while(external_mMatcher.find()){
            System.out.println(external_mMatcher.group());
        }
        //  <a href="https://a.com">

    }
}

 

 

 

 

 

[REFERENCE]

https://developer88.tistory.com/90

 

'개발 > Java' 카테고리의 다른 글

[Java] Iterator  (0) 2019.09.03
[Java] HashSet  (0) 2019.09.03
[Java] 정규표현식, Regular Expression  (0) 2019.09.03
[Java] 데이터 타입  (0) 2019.08.23
[Java] ArrayList, 참조값 복사와 값 복사 clone()  (0) 2019.08.22
Comments