시소당
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 정규식에 대한 자세한 내용을 살펴보려면 자바 온라인 자습서의 정규 표현식 편을 참고하면 된다.