[Java] Pattern, Matcher Class 사용하기

2026. 1. 22. 11:08공부/Java

CASE

코드를 사용하는 데이터가 있는데, 기존대로라면 쿼리에서 서브쿼리로 가지고 왔어야 할 것을, DB 서버가 달라서 가져오지 못하는 문제가 생겼다.

 

다른 때였다면 그냥 

쿼리결과 List로 받기 -> API를 사용해서 codelist map으로 조회 -> foreach로 매칭시켜주기 

// API로 조회해 온 codeMap
Map<String, String> codeMap = apiReulst.getData();
// 쿼리 조회
List<Dto> resultList = repository.selectList();

// 코드 값 세팅
for(Dto dto : resultList) {
  String codeName = codeMap.get(dto.getCode());
  dto.setCodeName(codeName);
}

이런식으로 진행을 했을텐데

// API로 조회해 온 codeMap
Map<String, String> codeMap = apiReulst.getData();
// 쿼리 조회
List<Dto> resultList = repository.selectList();

// 코드 값 세팅
for(Dto dto : resultList) {
  String resultString = dto.getResultString(); // 제목:안녕, code:A0101, 작성자:민주대장
}

이번에는 이런 식으로 조합을 해서 값이 오는 상태... 

저 resultString의 code를 찾아서 codeList와 매핑해서 replace하는 방법이 없나 찾아보다가 Pattern, Matcher Class 를 사용해보게되었다

 

분명교수님이알려주셨을테지만... 교수님이거보시면안돼요

 

Pattern, Mather Class

Pattern Class

정규식을 다루기 위해 사용하는 클래스. 

정규식으로 문자열을 검증할때 사용하는데 복잡한 정규식의 경우 성능 저하가 될 수 있는 점 참고해서 사용하면 될 듯 싶다. 

 

Matcher Class

Pattern Class에서 반환한 값과 비교 대상 문자열의 전체 일치/부분 일치를 확인

 

SOLVE

내가 확인후 변환해야 할 코드명은 대문자 알파벳+숫자 네 개 조합이라는 패턴을 가지고 있었기에 하기 코드를 보면서 해당 사실을 참조하면 좋을 거 같다

// 알파벳 대문자 + 숫자 네글자 조합 정규식
Pattern pattern = Pattern.compile("[A-Z][0-9]{4}"); 

// 이 때 matcher의 값은 java.util.regex.Matcher[pattern=[A-Z][0-9]{4} region=0,258 lastmatch=]
Matcher matcher = pattern.matcher(resultString);

while(matcher.find()) {
    String code = matcher.group();
    String codeName = codeList.getOrDefault(code, '-');
    
    // 스트링은 불변. 값을 다시 대입해줘야함
    resultString = resultString.replace(code, codeName); // 제목:안녕, code:게시완료, 작성자:민주대장
 }

설명

[pattern=[A-Z][0-9]{4} region=0,258 lastmatch=]

pattern = 현재 정규식(알파벳 대문자 + 숫자 네글자).

retgion = 비교 대상. resultString의 길이가 258이라는 뜻이고, 0부터 258까지 맞는 코드가 있는지 찾는다는 것. 

lasterMatch = 찾은 결과. 현재 find() 메소드로 결과를 찾지 않았기 때문에  비어있음.

 

이렇게 조회하는 부분을 해결할 수 있었다!!

 

이제 반대인 검색하는 경우를 해결해야 하는 문제가 있지만...⭐ 이건 머리만 아플 뿐이지 어렵진 않기 때문에 또 열심히 하기로