Dev Note/Java2008. 3. 3. 23:28
Java SE의 정규 표현식(expression or regex)의 지원은 1.4 이후 자바 플랫품의 일부가 되어 왔다. java.util.regex package의 클래스는 펄 언어가 제공하는 것과 유사하게 패턴 매칭을 지원하지만 자바 언어구문 및 클래스를 사용한다.1.4 에서는 Pattern, Matcher, PatternSyntaxException 3가지 클래스가 있고, 1.5에서는 MatchResult 인터페이스가 추가되었다.

정규 표현식은 간단하게 Pattern과 Matcher를 사용한다. Pattern 클래스를 이용하여 정규 표현식을 정의하고, Matcher 클래스를 사용하여 입력 소스에 대한 패턴 매칭을 검사한다. 표현식에서 패턴에 구문 오류가 있으면 PatternSyntaxException이 발생된다.

-- 정규 표현식 사용 예
Pattern pattern = Pattern.compile(<regular expression>);
Matcher matcher = pattern.matcher(<input source>);

while(matcher.find()) {
    System.out.printf"Found: \"%s\" from %d to %d.%n", matcher.group(), matcher.start(), matcher.end());
}

-- 정규 표현식 사용 예제 프로그램
다음 코드는 기본적인 정규 표현식 프로그램으로 사용자가 정규 표현식과 비교 문자열을 입력하도록 하며, 입력 된 값을 이용하여 패턴 매칭되는 것을 출력한다.
import java.util.regex.*;

public class Regex {

    public static void main(String args[]) {
        Console console = System.console();

        // Get regular expression
        String regex = console.readLine("%nEnter expression: ");
        Pattern pattern = Pattern.compile(regex);

        // Get source
        String source = console.readLine("Enter input source: ");
        Matcher matcher = pattern.matcher(source);

        // Show matches
       while (matcher.find()) {
           System.out.printf("Found: \"%s\" from %d to %d.%n", matcher.group(), matcher.start(), matcher.end());
        }
    }
}

그러면 정규 표현식의 모양이 어떻게 되는지를 알아보자.
- Pattern 클래스는 보다 세부적인 사항을 제공하지만 기본적으로 정규 표현식은 다른 문자 시퀀스와 일치시킬 문자 시퀀스이다.
  예를 들어, "Hello, World" 문자열에서 개의 L("ll") 문자열 리터럴 패턴을 찾을 있다. 앞의 프로그램은 시작 위치 2 위치 4에서 "ll" 패턴을 찾을 것이다.
- 정규 표현식 패턴은 특수 메타 문자를 포함할 수 있다. 메타 문자는 정규 표현식에서 강력한 매칭 기능을 제공한다. 정규 표현식에서는 "([{\^-$|]})?*+."의 15문자를 메타 문자로 사용할 수 있다.

* 특수 메타 문자 *
대괄호([ ]) :
대활호 안의 문자 중 하나가 텍스트에서 발견되는 경우 매칭이 성공하는 일련의 문자를 지정할 수 있다. 단일 문자를 매칭하는 데만 사용된다.
개발 문자의 매칭 이외에 대괄호 문자([ ])를 사용하여 [j-z]로 지정된 j-z의 문자처럼 일정 범위의 문자를 매칭할 수 있다. 이러한 문자 범위는
"foo[j-z]"처럼 문자열 리터럴과 결합할 수도 있다.
[a-zA-Z]처럼 여러 범위를 결합하여 a에서 z 사이의 소문자와 대문자를 나타낼 수도 있다.
  "co[cl]a" 패턴은 coca 및 cola라는 단어와 매칭된다. cocla는 매칭되지 않는다.
 
"foo[j-z]" 패턴은 fool 단어와 매칭된다. food는 매칭되지 않는다.
^ : 문자열 리터럴 또는 문자 범위의 제외를 지정한다.
  "foo[^j-z]" 패턴은 foo로 시작하고 j에서 z
사이의 문자로 끝나지 않는 단어를 찾는다. food라는 문자열이 매칭에 성공하며, fool은 매칭되지 않는다.
마침표(.) : 임의 문자를 나타내는 데 지정된다.
  ".oney" 패턴은 money honey와 매칭되며 oney로 끝나는 5자의 어느 단어와도 매칭된다.
역슬래쉬(\) :
다른 문자와 함께 사용되어 전체 문자 집합이 지정된다. 숫자 집합을 나타내기 위해 [0-9]를 사용할 수 있지만 \d를 사용할 수도 있다. 숫자가 아닌 문자 집합을 나타내기 위해 [^0-9]를 사용할 수도 있다. 또는 \D의 미리 정의된 문자 클래스 문자열을 사용할 수 있다.
 
\s (whitespace), \S (non-whitespace), \w (word character [a-zA-Z0-9]), \W (non-word character), \p{Punct} (punctuation), \p{Lower} (lowercase [a-z]), \p{Upper} (uppercase [A-Z])
  자바 소스에서는
String regexString = "\\s"; 처럼 이스케이프해야 한다.
수량자({횟수}) : 동일 패턴의 반복 매칭을 지정한다. "[a-z][a-z][a-z]" 패턴을 사용할 수도 있지만 그럴 ":[a-z]{3}"으로 나타낼 수 있다. 수량자를 사용할 때 범위도 지정할 수 있다. {3}은 정확히 3번을 의미하지만 {3,}은 적어도 3번을 의미한다. 수량자 {3, 5}3번에서 5번까지의 패턴
물음표(?), 0, 더하기(+) : 수량자와 함께 사용되면서 회수를 특정 숫자가 아닌 0번 또는 한 번(?), 0번 이상(0), 한 번 이상(+)을 나타낸다.
  [a-z]? 패턴은 a-z의 문자와 0번 또는 한 번 매칭된다. [a-z]* 패턴은 a-z의 문자와 0번 이상 매칭된다. [a-z]+ 패턴은 a-z의 문자와 한 번 이상 매칭된다.

Java SE 정규식에 대한 자세한 내용을 살펴보려면 자바 온라인 자습서의 정규 표현식 편을 참고하면 된다.
Posted by as.wind.914