[Java] 정규표현식 2

앞서 자바에서 정규표현식을 사용하기 위해 자바가 제공하는 어떤 클래스들을 사용할 수 있는지 살펴보았습니다.

이번에는 String 클래스와 Pattern 및 Matcher 클래스를 사용하여 정규표현식을 통한 문자열 패턴 매칭을 수행하는 코드를 살펴보겠습니다.

1. String 클래스의 matches 메소드

matches 메소드를 사용하면 해당 문자열이 정규표현식과 일치하는지 알 수 있습니다. 비교하려는 문자열 객체의 matches 메소드를 호출할 때 인자로 정규표현식 문자열을 전달하면 됩니다.

메소드의 반환값은 참 또는 거짓입니다.

비교문자열.matches(“정규표현식”)

String regexEx1 = "github.com";
String regexEx2 = "https://github.com/github";

boolean result1 = regexEx1.matches("^github.com$");
System.out.println(result1);    // true

boolean result2 = regexEx2.matches("(github.com)");
System.out.println(result2);    // true

문자열의 패턴 매칭 결과를 참 또는 거짓으로 처리하는 로직에서 사용될 수 있습니다.

2. String 클래스의 replaceAll 메소드

replaceAll 메소드를 사용하면 패턴 매칭을 통해 해당 문자열 중 일부를 원하는 문자열로 변환할 수 있습니다. 비교하려는 문자열 객체의 replaceAll 메소드를 호출할 때 인자로 정규표현식 문자열과 대체하고자 하는 문자열을 전달하면 됩니다.

메소드의 반환값은 대체된 결과 문자열 객체입니다.

비교문자열.replaceAll(“정규표현식”, “대체문자열”)

String regexEx = "깃허브 010-1234-5678 github@github.co.kr";
String result = regexEx.replaceAll("([a-z]{6})", "git");
System.out.println(result);    // 깃허브 010-1234-5678 git@git.co.kr

문자열 중 특정 문자열을 원하는 문자열로 교체하는 로직(패턴 매칭 후 문자열 교체)에서 사용될 수 있습니다.

3. String 클래스의 split 메소드

split 메소드를 사용하면 패턴 매칭을 통해 해당 문자열을 특정 문자열을 기준으로 분리시킬 수 있습니다. 분리 대상이 되는 문자열 객체의 split 메소드를 호출할 때 인자로 정규표현식 문자열을 전달하면 됩니다.

메소드의 반환값은 분리된 문자열을 원소로 갖는 배열 객체입니다.

대상문자열.split(“정규표현식”)

String regexEx = "https://github.co.kr/github";
String[] result = regexEx.split("([\\W]+)");
for(String item:result) System.out.println(item);

결과는 다음과 같습니다.

https
github
co
kr
github

문자열을 특정 문자열을 기준으로 분리하는 로직에서 사용될 수 있습니다.

4. Pattern과 Matcher 클래스 사용

https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html
https://docs.oracle.com/javase/8/docs/api/java/util/regex/Matcher.html

java.util.regex 패키지에 존재하는 Pattern과 Matcher 클래스의 객체를 이용하면 정규표현식으로 다양한 처리를 할 수 있습니다.

사용 순서는 크게 세 단계로 정리할 수 있습니다.

  1. Pattern 클래스의 compile() 메소드를 이용하여 주어진 정규표현식을 패턴으로 컴파일합니다. 반환되는 값은 Pattern 객체입니다.
  2. Pattern 클래스의 matcher() 메소드를 이용하여 주어진 입력(문자열)과 정규표현식을 매칭시키는 matcher를 생성합니다. 반환되는 값은 Matcher 객체입니다.
  3. Matcher 인스턴스의 메소드를 사용하여 다양한 매칭 작업을 수행합니다.

Pattern pattern = Pattern.compile(“정규표현식”);
Matcher matcher = pattern.matcher(“대상문자열”);

Matcher 인스턴스를 생성했으면 메소드를 사용하여 패턴 매칭 작업을 수행하면 됩니다.

  1. matches() 메소드
    입력 시퀀스 전체를 패턴과 일치시키는 작업을 수행합니다. 즉, 정규표현식이 대상 문자열 전체와 일치하는 지 아닌지 판별합니다. 정규표현식이 대상 문자열 일부에만 매칭된다면 거짓을 반환합니다.

  2. lookingAt() 메소드
    입력 시퀀스의 처음부터 패턴과 일치시키는 작업을 수행합니다. 대상 문자열의 첫 번째 부터 매칭 작업을 하는 것은 matches() 메소드와 동일하지만 대상 문자열 전체를 대상으로 하지는 않습니다.

  3. find() 메소드
    입력 시퀀스 중 패턴과 일치하는 하위 시퀀스를 찾는 작업을 수행합니다. 대상 문자열의 시작 부분에서 부터 매칭 작업을 수행하며 이전 호출에서 매칭되는 경우를 찾은 경우, 다음 매칭은 일치하지 않았던 시퀀스부터 시작합니다. 주로 반복문과 함께 사용하여 매칭 작업을 수행합니다.

위 세 가지 메소드를 사용한 간단한 예제는 다음과 같습니다.

Pattern pattern = Pattern.compile("[a-z]+"); 

Matcher matcher1 = pattern.matcher("awefs");
Matcher matcher2 = pattern.matcher("23342");
Matcher matcher3 = pattern.matcher("sdfasa23423sdfa50023");

System.out.println("matches(): " + matcher1.matches() + ", " + matcher2.matches() + ", " + matcher3.matches());
System.out.println("lookingAt(): " + matcher1.lookingAt() + ", " + matcher2.lookingAt() + ", " + matcher3.lookingAt() + "\n");
matcher3.reset();

System.out.println(
  "matcher3.find(): " + matcher3.find() + "\n"
  + "matcher3.toMatchResult(): " + matcher3.toMatchResult() + "\n"
  + "matcher3.find(): " + matcher3.find() + "\n"
  + "matcher3.toMatchResult(): " + matcher3.toMatchResult() + "\n");
matcher3.reset();

while(matcher3.find()) {
  System.out.println("matcher3.group(): " + matcher3.group() + "\n"
    + "matcher3.start(): " + matcher3.start() + "\n"
    + "matcher3.end(): " + matcher3.end() + "\n");
}

matches(): true, false, false
lookingAt(): true, false, true

matcher3.find(): true
matcher3.toMatchResult(): java.util.regex.Matcher[pattern=[a-z]+ region=0,20 lastmatch=sdfasa]
matcher3.find(): true
matcher3.toMatchResult(): java.util.regex.Matcher[pattern=[a-z]+ region=0,20 lastmatch=sdfa]

matcher3.group(): sdfasa
matcher3.start(): 0
matcher3.end(): 6
matcher3.group(): sdfa
matcher3.start(): 11
matcher3.end(): 15

Categories:

Updated:

Comments