투케이2K

560. (kotlin/코틀린) [유틸 파일] getCallNumFormat 휴대폰 번호 및 지역 전화 번호 형식 문자열 포맷 함수 - Pattern , Matcher 정규식 사용 본문

Kotlin

560. (kotlin/코틀린) [유틸 파일] getCallNumFormat 휴대폰 번호 및 지역 전화 번호 형식 문자열 포맷 함수 - Pattern , Matcher 정규식 사용

투케이2K 2026. 4. 5. 12:52
728x90
반응형

[개발 환경 설정]

개발 툴 : AndroidStudio

개발 언어 : Kotlin

 

[소스 코드]

// --------------------------------------------------------------------------------------
[개발 및 테스트 환경]
// --------------------------------------------------------------------------------------

- 언어 : Java / Kotlin


- 개발 툴 : AndroidStudio


- 구분 : 유틸 파일 / 정규식 / Phone Format


- 사전) 👉 Matcher 간략 설명 : 

  >> Matcher 는 정규식(Pattern)을 특정 문자열에 적용해서 검색 , 매칭 결과 추출 , 치환을 수행하는 객체입니다.

    - 패키지 : java.util.regex.Matcher

  >> 자바의 정규식은 항상 2단계 구조입니다.
    
    Pattern pattern = Pattern.compile("정규식");
    Matcher matcher = pattern.matcher("대상 문자열");

// --------------------------------------------------------------------------------------






// --------------------------------------------------------------------------------------
[소스 코드]
// --------------------------------------------------------------------------------------

fun getCallNumFormat(callNum: String): String {

    // [리턴 변수 선언]
    var returnData = ""

    // [로직 처리 수행]
    try {

        if (stringNotNull(callNum) == true) { // Not Null

            // ------------------------------------------------------------
            // TODO 입력 된 값이 전화 번호 형식 및 휴대폰 정규식 패턴을 만족하는지 확인
            // ------------------------------------------------------------
            // TODO search ex : 010-1234-5678
            // TODO search ex : 02-1234-5678
            // TODO search ex : 054-123-4567
            // ------------------------------------------------------------
            // val patternString = "^01([0-9])-(\\d{3}|\\d{4})-\\d{4}$"; // TODO 휴대폰 찾기 정규식

            val patternString = "^(\\d{2}|\\d{3})-(\\d{3}|\\d{4})-\\d{4}$" // TODO 휴대폰, 지역 번호 까지 모두 호환 찾기 정규식

            // [인풋 값이 패턴 형식을 만족하는지 확인]
            val pattern = Pattern.compile(patternString)
            val matcher = pattern.matcher(callNum)

            if (matcher.matches() == true) { // TODO 패턴 형식 만족
                //S_Log.d("KWON_TWOK", ">>>>>>>>>>>>>>>>>>>>>>> [getCallNumFormat] : pattern matches success >>>>>>>>>>>>>>>>>>>>>>>");

                returnData = callNum
            } else { // TODO 패턴 만족 안함
                //S_Log.e("KWON_TWOK", ">>>>>>>>>>>>>>>>>>>>>>> [getCallNumFormat] : not pattern matches >>>>>>>>>>>>>>>>>>>>>>>");

                var replaceCallNum = callNum
                replaceCallNum = replaceCallNum.replace( // 특수문자 지우기 그룹 지정
                    "[!@#$%^&*().,?:;/_{}+=-]".toRegex(),
                    ""
                )

                /*
                replaceCallNum = replaceCallNum.replaceAll("-", ""); // 개별 지우기
                replaceCallNum = replaceCallNum.replaceAll("_", ""); // 개별 지우기
                replaceCallNum = replaceCallNum.replaceAll("[.\\s]", ""); // 개별 지우기
                replaceCallNum = replaceCallNum.replaceAll(":", ""); // 개별 지우기
                replaceCallNum = replaceCallNum.replaceAll("/", ""); // 개별 지우기
                // */

                replaceCallNum = replaceCallNum.replace(" ".toRegex(), "") // 공백 제거

                // TODO 치환된 문자열이 모두 숫자 구정 및 전화 번호 및 휴대폰 번호 길이 만족 체크
                if (stringNotNull(replaceCallNum) == true
                    && replaceCallNum.matches("\\d+".toRegex()) == true) { // 널이 아니고, 모두 숫자로 구성 여부 확인

                    if (replaceCallNum.length == 11) { // TODO 01012345678 (11 자)
                        returnData = replaceCallNum.replace(
                            "(\\d{3})(\\d{4})(\\d{4})".toRegex(),
                            "$1-$2-$3"
                        )

                    } else if (replaceCallNum.length == 10) { // TODO 0212345678 / 0541234567 (10 자)

                        val subPatternString = "^(0[3-6][1-4])(\\d{3})\\d{4}$" // TODO 서울 외의 지역 번호 인 경우
                        val subPattern = Pattern.compile(subPatternString)
                        val subMatcher = subPattern.matcher(replaceCallNum)

                        returnData = if (subMatcher.matches() == true) {
                            replaceCallNum.replace(
                                "(\\d{3})(\\d{3})(\\d{4})".toRegex(),
                                "$1-$2-$3"
                            )
                        } else {
                            replaceCallNum.replace(
                                "(\\d{2})(\\d{4})(\\d{4})".toRegex(),
                                "$1-$2-$3"
                            )
                        }

                    } else {
                        S_Log.e("KWON_TWOK", ">>>>>>>>>>>>>>>>>>>>>>> [getCallNumFormat] : Error = replaceCallNum length match error >>>>>>>>>>>>>>>>>>>>>>>")
                    }

                } else {
                    S_Log.e("KWON_TWOK", ">>>>>>>>>>>>>>>>>>>>>>> [getCallNumFormat] : Error = replaceCallNum is not number >>>>>>>>>>>>>>>>>>>>>>>")
                }
            }
        }

    } catch (e: Exception) {
        e.printStackTrace()
    }

    // ------------------------------------------------------------
    // TODO return ex : 010-1234-5678
    // TODO return ex : 02-1234-5678
    // TODO return ex : 054-123-4567
    // ------------------------------------------------------------
    S_Log.w("KWON_TWOK", ">>>>>>>>>>>>>>>>>>>>>>> [getCallNumFormat] : Length = " + returnData.length.toString() + " / " + returnData.toString() + " >>>>>>>>>>>>>>>>>>>>>>>")

    // [리턴 반환]
    return returnData
}

// --------------------------------------------------------------------------------------






// --------------------------------------------------------------------------------------
[참고 사이트]
// --------------------------------------------------------------------------------------

[stringRegexpContains : String 문자열에 특정 정규식 패턴 포함 확인]

https://kkh0977.tistory.com/5854

https://blog.naver.com/kkh0977/223409583220?trackingCode=blog_bloghome_searchlist


[matches 정규식 - matches 정규식을 사용해 문자,숫자,특수문자 여부 확인]

https://kkh0977.tistory.com/53

https://blog.naver.com/kkh0977/222191690480?trackingCode=blog_bloghome_searchlist


[matches 정규식 (RegEx) 사용법 정리 - 특수문자 제거 및 지정 문자 허용]

https://kkh0977.tistory.com/1098

https://blog.naver.com/kkh0977/222463866741?trackingCode=blog_bloghome_searchlist

// --------------------------------------------------------------------------------------
 
728x90
반응형
Comments