정규 표현식
정규 표현식(正規表現式, 영어: regular expression, 간단히 regexp[1] 또는 regex, rational expression)[2][3] 또는 정규식(正規式)은 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어이다. 정규 표현식은 많은 텍스트 편집기와 프로그래밍 언어에서 문자열의 검색과 치환을 위해 지원하고 있으며, 특히 펄과 Tcl은 언어 자체에 강력한 정규 표현식을 구현하고 있다.
- 위키백과
정규 표현식 문법
기호 | 설명 | 예시 |
^ | 문자열의 시작을 의미한다. [ ] 대괄호 안에 있다면 부정(not)을 의미한다. |
^a : a로 시작하는 문자열 [^abc] : 문자 a, b, c를 제외한 모든 문자 |
$ | 문자열의 끝을 의미한다. | a$ : a로 끝나는 문자열 |
. | 개행(new line)을 제외한 모든 문자를 의미한다. | |
* | 0번 이상 반복을 의미한다. | ab* : a, ab, abb |
+ | 1번 이상 반복을 의미한다. | ab+ : ab, abb |
? | 0번 또는 1번을 의미한다. | ab? : a, ab |
- | 사이의 문자 또는 숫자를 의미한다. | [a-z] : a ~ z |
[ ] | 대괄호 안에 특정 문자 집합을 지정할 수 있고, 그 중 하나와 일치하는 경우를 의미한다. | [abc] : a, b, c |
{n} | 정확히 n번 반복을 의미한다. | a{3} : aaa |
{n,} | 최소 n번 반복을 의미한다. | a{2,} : aa, aaa |
{n, m} | n번 이상 m번 이하 반복을 의미한다. | a{2, 3} : aa, aaa |
\ | \(이스케이프) 뒤에 특수 문자가 오면 문자 자체를 의미한다. | |
\d | 숫자를 의미한다. | |
\D | 숫자가 아닌 문자를 의미한다. (숫자의 부정) | |
\w | 단어 문자를 의미한다. (알파벳, 숫자, 밑줄) | |
\W | 단어 문자가 아닌 문자를 의미한다. (단어의 부정) | |
\s | 공백 문자를 의미한다. (스페이스, 탭) | |
\S | 공백 문자가 아닌 문자를 의미한다. (공백의 부정) |
자바에서의 정규 표현식
Pattern 클래스
Pattern은 정규 표현식을 정의하는데 사용한다.
메서드 정의 | 설명 |
Pattern compile(String regex) | 주어진 정규 표현식을 갖는 Pattern 객체를 생성한다. |
String pattern() | 생성한 정규 표현식을 문자열로 반환한다. |
Matcher matcher(CharSequence input) | 주어진 문자 시퀀스를 매칭하는 Matcher 객체를 생성한다. |
boolean matches(String regex, CharSequence input) | 정규 표현식과 문자 시퀀스가 일치하는지 확인한다. |
String[] split(CharSequence input) String[] split(CharSequence input, int limit) |
주어진 정규 표현식을 기준으로 문자열을 나누어 배열로 반환한다. limit이 양수일 경우 limit - 1개 까지만 분할하고 나머지는 그대로 배열로 반환한다. limit이 0 또는 음수일 경우에는 제한 없이 분할해 배열로 반환한다. |
Matcher 클래스
Matcher는 Pattern 클래스에서 정의한 정규 표현식을 이용해 대상 문자열과 비교하는데 사용한다.
메서드 정의 | 설명 |
Pattern pattern() | Matcher 객체와 연관된 Pattern 객체를 반환한다. |
Matcher usePattern(Pattern newPattern) | Matcher 객체가 사용하는 Pattern을 변경한다. |
Matcher reset(CharSequence input) | Matcher 객체가 비교하는 문자 시퀀스를 변경한다. |
int start() | 매칭된 문자 시퀀스의 시작 인덱스를 반환한다. |
int end() | 매칭된 문자 시퀀스의 끝 인덱스를 반환한다. |
String group() | 매칭된 문자열을 반환한다. |
boolean matches() | Matcher 객체 생성 시의 문자열 전체가 매칭되는지 확인한다. |
boolean find() | 패턴이 매칭되는지 확인한다. |
String replaceAll(String replacement) | 매칭된 모든 문자 시퀀스를 replacement로 변경한다. |
예시
- a*d
- a가 0번 이상 반복되고, 바로 뒤가 d로 끝나는 문자열
- d, ad, aad 등
- a.*d
- a로 시작하고, 그 뒤에 어떤 문자가 0번 이상 반복되고, d로 끝나는 문자열
- ad, abcd
백준 9996번 : https://karen0117.tistory.com/131
import java.io.*;
import java.util.*;
import java.util.regex.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
// StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(br.readLine());
String[] inputPattern = br.readLine().split("\\*");
Pattern pattern = Pattern.compile(inputPattern[0] + ".*" + inputPattern[1]);
for (int i = 0; i < N; i++) {
String s = br.readLine();
Matcher matcher = pattern.matcher(s);
if (matcher.matches()) {
bw.write("DA\n");
} else {
bw.write("NE\n");
}
}
bw.flush();
}
}