문자열에서 특정 문자 조합을 찾기 위한 패턴
java에서 정규식을 사용하기 위해서는 java.util.regex
의 Pattern
, Matcher
두 가지의 클래스를 이용한다.
Perl에서 사용되는 구문과 유사한 구문으로 문자열 형식으로 지정된 정규식을 나타냄
Pattern을 통해 문자열로 지정된 정규식을 컴파일한 후, 결과 패턴을 이용해 Matcher를 생성한다.
Pattern p = Pattern.compile("a*b");
Matcher m = p.matcher("aaaaab");
boolean b = m.matches();
boolean b = Pattern.matches("a*b", "aaaaab");
위의 두 코드는 결과가 같다. 이때 이 둘의 차이점은 정규식의 재사용
을 두고 얘기할 수 있다.
Matcher를 생성하면 여러 텍스트에 대해서 하나의 생성된 Matcher를 계속 반복해서 사용할 수 있지만, 두번째와 같이 Matcher를 생성하지 않으면, 사용된 정규식은 한번만 사용된다.
이름 | 리턴 | 설명 |
---|---|---|
static compile(String regex) | void | 지정된 정규식을 패턴으로 컴파일 |
static compile(String regex, int flags) | void | 지정된 정규식을 패턴으로 컴파일 |
matcher(CharSequence input) | Matcher | Matcher 생성 |
static matches(String regex, CharSequence input) | boolean | 지정된 정규식 패턴과 일치하는지의 여부 |
split(CharSequence input) | String[] | 지정된 정규식을 기준으로 텍스트를 분할 |
정규식을 만들다 보면 (
,[
,.
등 처럼 특수문자를 그대로 인식해야하는 경우나 \d
등 같은 정규식 문법을 사용해야하는데, java에 "\("
으로 입력해 사용하면 오류가 난다.
\\
이렇게 백슬래시를 2번 붙여서 사용한다. \\(
(
-> \\(
\
앞에 한번 더 붙여 사용한다.\d
-> \\d
주어진 패턴과 텍스트가 일치하는지 확인하는 엔진
만약
matches()
,lookingAt()
,find()
를 하지 않고 바로group()
와 같은 메서드를 호출하면 오류 발생
String orgFileName = "가나다(1)";//테스트용 텍스트
Pattern pattern = Pattern.compile("\\([0-9]+\\)$");//정규식 컴파일
Matcher matcher = pattern.matcher(orgFileName);//Matcher 생성
while (matcher.find()) {//확인 작업
String group = matcher.group();//찾아진 텍스트
System.out.println("Found: " group);
}
matches()
: 정규식을 전체 문자열에 대해서 완전히
일치하는지 여부
ex) 정규식이
\[a-zA-Z\\s\]
인 경우,
"aaa 123 bbb" -> false
"aaa bbb" -> true
lookingAt()
: 정규식에 일치하는 문자열로 시작하는지 여부
ex) 정규식이
123
인 경우,
"abd 123" ->false
"123 abc" -> true
find()
: 정규식에 해당하는 문자열이 있는지 여부
ex) 정규식이
123
인 경우,
"abd 123" -> true
"123 abc" -> true
"가나다 text 123 가나다 12 abc" -> true
"가나다 text 111 가나다 12 abc" -> false
이름 | 리턴 | 설명 |
---|---|---|
group() | String | 지정된 정규식과 일치하는 텍스트 |
group(int group) | String | 지정된 정규식과 일치하는 텍스트 중 입력한 순번의 텍스트 반환 |
groupCount() | int | 지정된 정규식과 일치하는 텍스트의 개수 |
start() | int | 지정된 정규식과 일치하는 텍스트 시작 인덱스 |
end() | int | 지정된 정규식과 일치하는 텍스트 끝 인덱스 |
참고
1. java 공식 문서
2. Java RegEx: 파트 5 - match(), lookAt(), find()