regex 패키지 클래스
자바에서 java.util.regex 패키지를 사용하여 더 효율적인 정규표현식을 사용 할 수 있다.
패키지 안의 클래스는 주로 Pattern 클래스와 Matcher 클래스가 사용된다.
이들 정규식 클래스의 장점으로는 정규식을 Pattern 객체로 미리 컴파일 해둘수 있어서 처리 속도가 좀 더 빠르고, 매칭된 데이터를 좀더 상세히 다룰 수 있다.
Pattern 클래스
문자열을 정규표현식 패턴 객체로 변환해주는 역할을 한다.
이때 문자열을 정규식 문법에 알맞게 구성해주어야 한다. 그렇지않으면 예외(Exception)이 발생하게 된다.
Pattern 클래스는 일반 클래스처럼 공개된 생성자를 제공하지 않는다. 그래서 정규식 패턴 객체를 생성하려면 compile() 정적 메소드를 호출해야 한다.
이렇게 Pattern 객체로 컴파일된 정규식은 뒤의 Matcher 클래스에서 사용된다
// 문자열 형태의 정규표현식 문법을 정규식 패턴으로 변환
String patternString = "^[0-9]*$";
Pattern pattern = Pattern.compile(patternString); // Pattern 객체로 컴파일된 정규식은 뒤의 Matcher 클래스에서 사용된다
matches() 메서드의 첫번째 입력값은 정규식 문자열이고, 두번째 입력값은 검증 대상 문자열 이다. 검증 후 대상문자열이 정규표현식과 일치하면 true, 그렇지 않다면 false값을 리턴한다.
클래스 메서드 | 반환 타입 | 설명 |
compile(String regex) | Pattern | 정규표현식의 패턴을 작성 |
matches(String regex, CharSequence input) | Bqoolean | 정규표현식의 패턴과 문자열이 일치하는지 체크 일치할 경우 true, 일치하지 않는 경우 false를 리턴 (일부 문자열이 아닌 전체 문자열과 완벽히 일치 해야한다) |
asPredicate() | 문자열을 일치시키는 데 사용할 수 있는 술어를 작성 | |
pattern() | String | Pattern 객체가 컴파일된 정규 표현식 문자열을 반환합니다. |
split(CharSequence input) | String[] | 정규 표현식을 기준으로 입력 문자열을 분리하여 배열을 반환한다. |
Matcher 클래스
Matcher 클래스는 대상 문자열의 패턴을 해석하고 주어진 패턴과 일치하는지 판별하고 반환된 필터링된 결과를 응답한다.
Matcher 클래스 역시 Pattern 클래스와 마찬가지로 공개된 생성자가 없다. Matcher객체는 Pattern 객체의 matcher() 메소드를 호출해서 얻는다.
메서드 | 반환 타입 | 설 명 |
find( ) | boolean | 패턴이 일치하는 경우 true를 반환, 불일치하는 경우 false반환 (여러개가 매칭되는 경우 반복실행하면 일치하는 부분 다음부터 이어서 매칭됨) |
find(int start) | boolean | start 위치 이후부터 매칭검색 |
start( ) | int | 매칭되는 문자열의 시작위치 반환 |
start(int group) | int | 지정된 그룹이 매칭되는 시작위치 반환 |
end( ) | int | 매칭되는 문자열 끝위치의 다음 문자위치 반환 |
end(int group) | int | 지정된 그룹이 매칭되는 끝위치의 다음 문자위치 반환 |
group( ) | String | 가장 우선 매칭된 부분을 반환 |
group(int group) | String | 그룹화되어 매칭된 패턴중 group 번째 부분 반환 |
groupCount( ) | int | 괄호로 지정해서 그룹핑한 패턴의 전체 개수 반환 |
matches( ) | boolean | 패턴이 전체 문자열과 일치할 경우 true반환 (일부 문자열이 아닌 전체 문자열과 완벽히 일치 해야한다) |
Pattern.compile() 을 통해 정규식 문자열을 패턴 객체로 변환
패턴 객체에서 matcher() 메소드를 통해 문자열을 비교하고 검사한 결과값을 담은 매처 객체를 반환
매처 객체에서 메소드로 원하는 결과값을 가져온다.
예제코드
String textWithGroups = "John 123 Doe";
Pattern patternWithGroups = Pattern.compile("(\\w+) (\\d+) (\\w+)");
Matcher matcherWithGroups = patternWithGroups.matcher(textWithGroups);
if (matcherWithGroups.find()) {
System.out.println("Entire match: " + matcherWithGroups.group());
System.out.println("First group: " + matcherWithGroups.group(1));
System.out.println("Second group: " + matcherWithGroups.group(2));
System.out.println("Third group: " + matcherWithGroups.group(3));
}
// groupCount() 메서드를 사용하여 그룹 수를 출력
int groupCount = matcherWithGroups.groupCount();
System.out.println("Number of groups: " + groupCount);
}
//응답 값
Entire match: John 123 Doe
First group: John
Second group: 123
Third group: Doe
패턴
• (\\w+): 하나 이상의 단어 문자 (첫 번째 그룹)
• (\\d+): 하나 이상의 숫자 (두 번째 그룹)
• (\\w+): 하나 이상의 단어 문자 (세 번째 그룹)
정규표현식 테스트 사이트
https://www.regexplanet.com/advanced/java/index.html
'개-발 > Java + Spring + Kotlin' 카테고리의 다른 글
[WebSoket] Spring + SocketJs 사용하기 ( 테스트 Html코드 공유 ) (0) | 2024.11.02 |
---|---|
[Spring Batch] 반복 오류 제어 (0) | 2024.09.01 |
[Java] 정규표현식 regex (0) | 2024.07.29 |
[MSA] 분산 시스템 이벤트 소싱 구현 ( Transaction OutBox Pattern ) (0) | 2024.07.26 |
[MSA] Transaction Outbox 패턴 (0) | 2024.07.10 |