λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Java

[Java] - μžλ°” μ •κ·œ ν‘œν˜„μ‹(Regular Expression) + 2021 카카였 μ½”ν…Œ(μ‹ κ·œ 아이디 μΆ”μ²œ)

by 주발2 2021. 3. 28.
λ°˜μ‘ν˜•

μ•ˆλ…•ν•˜μ„Έμš”~ 이전에 μš΄μ˜ν•˜λ˜ λΈ”λ‘œκ·Έ 및 GitHub, 곡뢀 λ‚΄μš©μ„ μ •λ¦¬ν•˜λŠ” Study-GitHub κ°€ μžˆμŠ΅λ‹ˆλ‹€!

 λ„€μ΄λ²„ λΈ”λ‘œκ·Έ

 GitHub

Study-GitHub

 πŸ”


 

βœ” μ •κ·œ ν‘œν˜„μ‹(Regular Expression)

 

μ•ˆλ…•ν•˜μ„Έμš”, μ΄λ²ˆμ— 정리할 λ‚΄μš©μ€ Javaμ—μ„œμ˜ μ •κ·œ ν‘œν˜„μ‹(Regular Expression) μž…λ‹ˆλ‹€.

 

졜근 κ°œλ°œμ„ ν•˜λ©΄μ„œ μ •κ·œ ν‘œν˜„μ‹μ„ μ‚¬μš©ν•˜λ©΄ 더 κ°„λ‹¨ν•˜κ²Œ ν•΄κ²°ν•  수 μžˆλŠ” λ¬Έμ œλ“€μ„ κ½€ 자주 μ ‘ν–ˆμ—ˆκ³ ,

κ·Έλ•Œλ§ˆλ‹€ μ£Όλ¨Ή κ΅¬κ΅¬μ‹μœΌλ‘œ μ •ν™•ν•œ 이해없이 검색을 톡해 해결을 ν•΄μ™”μ—ˆμŠ΅λ‹ˆλ‹€...

λ”°λΌμ„œ μ΄λ²ˆμ— 정리λ₯Ό ν•œ 번 ν•˜λ €κ³  ν•©λ‹ˆλ‹€ ✏

 

 

μœ„ν‚€λ°±κ³Όμ— λ‚˜μ™€μžˆλŠ” μ •κ·œ ν‘œν˜„μ‹μ˜ μ •μ˜λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

μ •κ·œ ν‘œν˜„μ‹(正規葨現式, μ˜μ–΄: regular expression, κ°„λ‹¨νžˆ regexp[1] λ˜λŠ” regex, rational expression)[2][3] λ˜λŠ” μ •κ·œμ‹(正規式)은 νŠΉμ •ν•œ κ·œμΉ™μ„ 가진 λ¬Έμžμ—΄μ˜ 집합을 ν‘œν˜„ν•˜λŠ” 데 μ‚¬μš©ν•˜λŠ” ν˜•μ‹ 언어이닀. μ •κ·œ ν‘œν˜„μ‹μ€ λ§Žμ€ ν…μŠ€νŠΈ νŽΈμ§‘κΈ°μ™€ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œ λ¬Έμžμ—΄μ˜ 검색과 μΉ˜ν™˜μ„ μœ„ν•΄ μ§€μ›ν•˜κ³  있으며, 특히 νŽ„κ³Ό Tcl은 μ–Έμ–΄ μžμ²΄μ— κ°•λ ₯ν•œ μ •κ·œ ν‘œν˜„μ‹μ„ κ΅¬ν˜„ν•˜κ³  μžˆλ‹€.

컴퓨터 κ³Όν•™μ˜ μ •κ·œ μ–Έμ–΄λ‘œλΆ€ν„° μœ λž˜ν•˜μ˜€μœΌλ‚˜ κ΅¬ν˜„μ²΄μ— λ”°λΌμ„œ μ •κ·œ 언어보닀 더 넓은 μ–Έμ–΄λ₯Ό ν‘œν˜„ν•  수 μžˆλŠ” κ²½μš°λ„ 있으며, 심지어 μ •κ·œ ν‘œν˜„μ‹ 자체의 문법도 μ—¬λŸ¬ 가지 μ‘΄μž¬ν•˜κ³  μžˆλ‹€. ν˜„μž¬ λ§Žμ€ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄, ν…μŠ€νŠΈ 처리 ν”„λ‘œκ·Έλž¨, κ³ κΈ‰ ν…μŠ€νŠΈ νŽΈμ§‘κΈ° 등이 μ •κ·œ ν‘œν˜„μ‹ κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€. μΌλΆ€λŠ” νŽ„, μžλ°”μŠ€ν¬λ¦½νŠΈ, λ£¨λΉ„, Tcl처럼 문법에 λ‚΄μž₯λ˜μ–΄ μžˆλŠ” 반면 λ‹·λ„· μ–Έμ–΄, μžλ°”, νŒŒμ΄μ¬, POSIX C, C++ (C++11 μ΄ν›„)μ—μ„œλŠ” ν‘œμ€€ 라이브러리λ₯Ό 톡해 μ œκ³΅ν•œλ‹€. κ·Έ λ°–μ˜ λŒ€λΆ€λΆ„μ˜ 언어듀은 λ³„λ„μ˜ 라이브러리λ₯Ό 톡해 μ •κ·œ ν‘œν˜„μ‹μ„ μ œκ³΅ν•œλ‹€.

μ •κ·œ ν‘œν˜„μ‹μ€ κ²€μƒ‰ 엔진, μ›Œλ“œ ν”„λ‘œμ„Έμ„œμ™€ λ¬Έμ„œ νŽΈμ§‘κΈ°μ˜ μ°Ύμ•„ λ°”κΎΈκΈ° λŒ€ν™”μƒμž, 그리고 sed, AWK와 같은 문자 처리 μœ ν‹Έλ¦¬ν‹°, μ–΄νœ˜ 뢄석에 μ‚¬μš©λœλ‹€.

ko.wikipedia.org/wiki/%EC%A0%95%EA%B7%9C_%ED%91%9C%ED%98%84%EC%8B%9D

μœ„μ—μ„œ 핡심 λ¬Έμž₯은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

"νŠΉμ •ν•œ κ·œμΉ™μ„ 가진 λ¬Έμžμ—΄μ˜ 집합을 ν‘œν˜„ν•˜λŠ” 데 μ‚¬μš©ν•˜λŠ” ν˜•μ‹ μ–Έμ–΄"

 

 

μ •κ·œ ν‘œν˜„μ‹μ€ λŒ€λΆ€λΆ„ λ¬Έμžμ—΄κ³Ό κ΄€λ ¨λœ 문제 해결을 μœ„ν•΄ μ‚¬μš©ν•©λ‹ˆλ‹€.

κ°€μž₯ 많이 μ‚¬μš©ν•˜λŠ” μ˜ˆμ‹œκ°€ 이메일, ν•Έλ“œν° 번호 λ“±μ˜ μœ νš¨μ„± 검사λ₯Ό μœ„ν•΄ μ‚¬μš©ν•©λ‹ˆλ‹€.

 

μ •κ·œ ν‘œν˜„μ‹μ— λŒ€ν•΄ 문법과 예제λ₯Ό 톡해 μ’€ 더 μžμ„Ένžˆ μ‚΄νŽ΄λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.


 

 

πŸŽ— μ •κ·œ ν‘œν˜„μ‹ 문법

μ •κ·œ ν‘œν˜„μ‹μ˜ κΈ°ν˜ΈλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

 

β€» 2021.08.09 \w, \W λ‚΄μš© μˆ˜μ •

\w 의 경우 μ•ŒνŒŒλ²³μ΄λ‚˜ 숫자, 언더바(_) 기호λ₯Ό μ°ΎμŠ΅λ‹ˆλ‹€.

\W 의 경우 μ•ŒνŒŒλ²³μ΄λ‚˜ 숫자, 언더바(_)λ₯Ό μ œμ™Έν•œ λ¬Έμžμž…λ‹ˆλ‹€.

public class Tests {
    public static void main(String[] args) {
        String str = "a_b-c";
        System.out.println(str.replaceAll("\\W", ""));
    }
}

 

 

λ”°λΌμ„œ 언더바도 μ œμ™Έλ₯Ό ν•΄μ•Όν•  경우, λ‹€μŒκ³Ό 같이 μž‘μ„±μ„ ν•΄μ•Ό ν•©λ‹ˆλ‹€. 😭

String str = "a_b-c";
System.out.println(str.replaceAll("[\\W_]", ""));
// System.out.println(str.replaceAll("[a-zA-Z0-9]", "")); μœ„μ™€ λ™μΌν•œ κ²°κ³Ό

 

 

 

 

 

 

μ •κ·œ ν‘œν˜„μ‹μ˜ λŒ€λΆ€λΆ„μ€ μœ„μ— λ‚΄μš©μ΄ μ „λΆ€μΈλ°μš”, μœ„ λ‚΄μš©μ„ μ΄ν•΄ν•˜λ”λΌλ„ μ‹€μ œλ‘œ μ‚¬μš©λ˜λŠ” μ •κ·œμ‹μ„ μ‚΄νŽ΄λ³΄λ©΄ 

무슨 의미λ₯Ό λœ»ν•˜λŠ”μ§€ μ΄ν•΄ν•˜κΈ° νž˜λ“  μ •κ·œμ‹μ΄ λͺ‡λͺ‡ μ‘΄μž¬ν•©λ‹ˆλ‹€... 🀦‍♂️

λ”°λΌμ„œ μœ„ μ •κ·œ ν‘œν˜„μ‹μ—μ„œ 더 λ‚˜μ•„κ°€ μ‹€μ œ 예제λ₯Ό 톡해 μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

μœ„ μ •κ·œ ν‘œν˜„μ‹ κΈ°ν˜Έμ—μ„œ κΈ°μ–΅ν•΄μ•Ό ν•  점은, λ°±μŠ¬λŸ¬μ‹œ(\) κ°€ ν¬ν•¨λ˜μ–΄ μžˆλŠ” κΈ°ν˜Έλ“€μž…λ‹ˆλ‹€.

μ •κ·œ ν‘œν˜„μ‹μ—μ„œ λ°±μŠ¬λŸ¬μ‹œ(\)λŠ” ν™•μž₯ 문자둜, λ‹€μŒμ— 일반 λ¬Έμžκ°€ 였면 특수문자둜 μ·¨κΈ‰ν•˜κ³ , λ°±μŠ¬λŸ¬μ‹œ λ‹€μŒμ— νŠΉμˆ˜λ¬Έμžκ°€ 였면 κ·Έ 문자 자체λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.

 

예λ₯Ό λ“€μ–΄, μ•ŒνŒŒλ²³μ΄λ‚˜ 숫자λ₯Ό λ‚˜νƒ€λ‚΄λŠ” \w 같은 경우 Javaμ—μ„œ \ μžμ²΄λŠ” 특수문자둜 μ·¨κΈ‰ν•˜κΈ° λ•Œλ¬Έμ—, μ•ŒνŒŒλ²³μ΄λ‚˜ 숫자λ₯Ό νŒλ³„ν•˜λŠ” μ •κ·œμ‹ κΈ°ν˜ΈλŠ” λ‹€μŒκ³Ό 같이 μž‘μ„±μ„ ν•΄μ•Όν•©λ‹ˆλ‹€.

\\w // μ•ŒνŒŒλ²³μ΄λ‚˜ 숫자

μœ„ μ„€λͺ…λ§Œ λ³΄κ³ λŠ” μ •ν™•νžˆ 무엇을 μ˜λ―Έν•˜λŠ”μ§€ μ΄ν•΄ν•˜κΈ°κ°€ νž˜λ“€ 수 μžˆμœΌλ―€λ‘œ, μ•„λž˜μ—μ„œ μ‚΄νŽ΄λ³Ό 예제λ₯Ό 톡해 μ΄ν•΄ν•˜μ‹œλ©΄ 될 것 κ°™μŠ΅λ‹ˆλ‹€ !!

 

 

μ •κ·œ ν‘œν˜„μ‹ κ΄€λ ¨ν•΄μ„œ λ„ˆλ¬΄λ‚˜ λ‹€μ–‘ν•œ κΈ°ν˜Έλ“€μ΄ μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ—, μ „λΆ€ λ‹€ μ™Έμš°λŠ” 것은 λΆˆκ°€λŠ₯ν•˜κ³ ,

μ–΄λ– ν•œ 상황에 μ–΄λ– ν•œ κΈ°ν˜Έκ°€ μ‚¬μš©λ˜λŠ”μ§€ μ΄ν•΄ν•˜λŠ” 것이 μ€‘μš”ν•œ 것 κ°™μŠ΅λ‹ˆλ‹€.

 

개인적으둜 주둜 μ‚¬μš©ν•˜λŠ” κΈ°ν˜Έλ“€μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

[]  ()  \w  *  +  {}  ^  $  ...

 

 

자주 μ‚¬μš©ν•˜λŠ” νŒ¨ν„΄μ˜ μ •κ·œ ν‘œν˜„μ‹μ„ λ‚˜νƒ€λ‚΄λ³΄λ©΄ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

μ •κ·œ ν‘œν˜„μ‹ 의미
^[0-9]*$ == \\d 숫자
^[a-zA-Z]*$ μ•ŒνŒŒλ²³
^[κ°€-힣]*$ ν•œκΈ€
^[a-zA-Z0-9] μ•ŒνŒŒλ²³μ΄λ‚˜ 숫자
^[a-zA-Z0-9]+@[a-zA-Z0-9]+\\.[a-z]+$ 이메일(Email)
\w+@\w+\.\w+(\\.\\w+)? 이메일(Email)
^01(?:0|1|[6-9])-(?:\\d{3}|\\d{4})-\\d{4}$ νœ΄λŒ€ν° 번호

μœ„μ™€ 같이 일반적으둜 자주 μ‚¬μš©λ˜λŠ” μ •κ·œ ν‘œν˜„μ‹μ΄ μ‘΄μž¬ν•˜λŠ”λ°μš”, 처음 봀을땐 각 ν‘œν˜„μ‹μ΄ 무슨 의미λ₯Ό λ‚˜νƒ€λ‚΄λŠ”μ§€ νŒŒμ•…ν•˜κΈ° νž˜λ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

 

예제λ₯Ό 톡해 μ •κ·œ ν‘œν˜„μ‹μ„ 읡힐 것을 μΆ”μ²œλ“œλ¦½λ‹ˆλ‹€ !!


 

 

 

πŸŽ— μ •κ·œ ν‘œν˜„μ‹ 예제

μ˜ˆμ œμ—μ„œ μ‚΄νŽ΄λ³Ό 클래슀 및 λ©”μ†Œλ“œλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

클래슀 및 λ©”μ†Œλ“œμ— λŒ€ν•œ μžμ„Έν•œ λ‚΄μš©μ€ 곡식 λ¬Έμ„œλ₯Ό μ°Έκ³ ν•΄μ£Όμ„Έμš” !

docs.oracle.com/javase/8/docs/api/

 

Java Platform SE 8

 

docs.oracle.com

 

 

 

Pattern 클래슀

  • μ •κ·œ ν‘œν˜„μ‹μ— λŒ€ν•œ λ¬Έμžμ—΄κΈ€ κ²€μ¦ν•˜λŠ” κΈ°λŠ₯
  • 곡개된 μƒμ„±μžλ₯Ό μ œκ³΅ν•˜μ§€ μ•ŠμŒ
  • νŒ¨ν„΄μ„ μƒμ„±ν•˜λ €λ©΄ Pattern 객체λ₯Ό λ°˜ν™˜ν•˜λŠ” 정적 compile λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•΄μ•Ό 함
  • matches() λ©”μ†Œλ“œλ₯Ό ν™œμš©ν•˜μ—¬ 검증
  • regex: μ •κ·œ ν‘œν˜„μ‹
  • input: 검증할 λ¬Έμžμ—΄
    public static boolean matches(String regex, CharSequence input) {
        Pattern p = Pattern.compile(regex);
        Matcher m = p.matcher(input);
        return m.matches();
    }

 

 

 

Matcher 클래슀

  • νŒ¨ν„΄μ„ ν•΄μ„ν•˜κ³  μž…λ ₯ λ¬Έμžμ—΄μ— λŒ€ν•΄ 일치 μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” 엔진
  • Pattern ν΄λž˜μŠ€μ™€ λ™μΌν•˜κ²Œ μ–΄λ– ν•œ 곡개된 μƒμ„±μžλ„ μ •μ˜ν•˜κ³  μžˆμ§€ μ•ŠμŒ
  • Pattern 객체의 matcher() λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•΄μ„œ μ–»μŒ
  • matches() λ©”μ†Œλ“œλ₯Ό ν™œμš©ν•˜μ—¬ 검증
  • regex: μ •κ·œ ν‘œν˜„μ‹
  • input: 검증할 λ¬Έμžμ—΄
    /**
     * Creates a matcher that will match the given input against this pattern.
     *
     * @param  input
     *         The character sequence to be matched
     *
     * @return  A new matcher for this pattern
     */
    public Matcher matcher(CharSequence input) {
        if (!compiled) {
            synchronized(this) {
                if (!compiled)
                    compile();
            }
        }
        Matcher m = new Matcher(this, input);
        return m;
    }

 

 

 

String.replaceAll()

  • Java의 λ¬Έμžμ—΄μ—μ„œ μ •κ·œμ‹μ„ μ‚¬μš©ν•˜λŠ” λ©”μ†Œλ“œ 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€.
  • λ¬Έμžμ—΄ 내에 μžˆλŠ” μ •κ·œμ‹(regex)와 λ§€μΉ­λ˜λŠ” λͺ¨λ“  λ¬Έμžμ—΄μ„ replacement 문자둜 μΉ˜ν™˜ν•©λ‹ˆλ‹€.
    public String replaceAll(String regex, String replacement) {
        return Pattern.compile(regex).matcher(this).replaceAll(replacement);
    }

 

 

μ €λŠ” String 클래슀의 replaceAll() λ©”μ†Œλ“œλ₯Ό 톡해 μ •κ·œ ν‘œν˜„μ‹μ΄ μ–΄λ–»κ²Œ μ‚¬μš©λ˜λŠ”μ§€ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€ !!

 

Pattern 클래슀 및 Matcher ν΄λž˜μŠ€μ— λŒ€ν•œ μ‚¬μš©λ²•μ€ μ•„λž˜ λΈ”λ‘œκ·Έλ₯Ό μ°Έκ³ ν•΄ μ£Όμ„Έμš” 😊

blog.naver.com/zzang9ha/222013925468

 

[Java/μžλ°”] - μ •κ·œ ν‘œν˜„μ‹(Regular Expression)

μ•ˆλ…•ν•˜μ„Έμš”~ 이번 μ‹œκ°„μ— 정리할 λ‚΄μš©μ€ "μ •κ·œ ν‘œν˜„μ‹" μž…λ‹ˆλ‹€.ν‰μ†Œμ— 코딩을 ν•˜λ©΄μ„œ μ •κ·œν‘œν˜„μ‹...

blog.naver.com

 

coding-factory.tistory.com/529

 

[Java] μžλ°” μ •κ·œ ν‘œν˜„μ‹ (Pattern, Matcher) μ‚¬μš©λ²• & 예제

μ •κ·œν‘œν˜„μ‹(Regular Expression)μ΄λž€ 컴퓨터 κ³Όν•™μ˜ μ •κ·œμ–Έμ–΄λ‘œλΆ€ν„° μœ λž˜ν•œ κ²ƒμœΌλ‘œ νŠΉμ •ν•œ κ·œμΉ™μ„ 가진 λ¬Έμžμ—΄μ˜ 집합을 ν‘œν˜„ν•˜κΈ° μœ„ν•΄ μ“°μ΄λŠ” ν˜•μ‹μ–Έμ–΄ μž…λ‹ˆλ‹€. κ°œλ°œμ„ ν•˜λ‹€λ³΄λ©΄ μ „ν™”λ²ˆν˜Έ, μ£Όλ―Όλ“±

coding-factory.tistory.com


 

 

πŸŽ—String.replaceAll(String regex, String replacement)

μ˜ˆμ œλŠ” 2021 카카였 λΈ”λΌμΈλ“œ μ±„μš© μ½”λ”© ν…ŒμŠ€νŠΈμ˜ 문제인 μ‹ κ·œ 아이디 μΆ”μ²œ μž…λ‹ˆλ‹€.

 

μœ„μ™€ 같이 μ•„μ΄λ””μ˜ μœ νš¨μ„±μ„ κ²€μ‚¬ν•˜λŠ” μ—¬λŸ¬ 단계가 μ‘΄μž¬ν•˜λŠ”λ°μš”,

각 단계λ₯Ό μ •κ·œ ν‘œν˜„μ‹μ„ 톡해 처리λ₯Ό ν•˜λ©΄ κ°„λ‹¨ν•˜κ²Œ ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

μœ„ λ¬Έμ œμ—μ„œ μ •κ·œ ν‘œν˜„μ‹μ„ 톡해 ν•΄κ²°ν•  수 μžˆλŠ” λ‹¨κ³„λŠ” 2단계, 3단계, 4단계, 6단계 정도 인 것 κ°™μŠ΅λ‹ˆλ‹€.

ν•˜λ‚˜μ”© μ‚΄νŽ΄λ΄…μ‹œλ‹€πŸ˜Ž

 

 

 

 

🎢 2단계 new_idμ—μ„œ μ•ŒνŒŒλ²³ μ†Œλ¬Έμž, 숫자, λΉΌκΈ°(-), 밑쀄(_), λ§ˆμΉ¨ν‘œ(.)λ₯Ό μ œμ™Έν•œ λͺ¨λ“  문자λ₯Ό μ œκ±°ν•©λ‹ˆλ‹€.

 

μœ„μ—μ„œ 핡심 ν‚€μ›Œλ“œλŠ” μ•ŒνŒŒλ²³ μ†Œλ¬Έμž, 숫자, λΉΌκΈ°, 밑쀄, λ§ˆμΉ¨ν‘œ μž…λ‹ˆλ‹€.

μ •κ·œ ν‘œν˜„μ‹μ€ μ•ŒνŒŒλ²³ μ†Œλ¬Έμž(a-z), 숫자(0-9 ν˜Ήμ€ \d), λΉΌκΈ°&밑쀄&λ§ˆμΉ¨ν‘œ(-_.) μž…λ‹ˆλ‹€.

 

λ”°λΌμ„œ 2단계λ₯Ό μ •κ·œ ν‘œν˜„μ‹μ„ 톡해 λͺ¨λ“  문자λ₯Ό μ œκ±°ν•˜λŠ” μ½”λ“œλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

// String s
s = s.replaceAll("[^a-z\\d\\-_.]*", "");
  • ^의 경우 λ¬Έμžμ—΄μ˜ μ‹œμž‘μ„ μ˜λ―Έν•˜μ§€λ§Œ, [] 내에 μ‘΄μž¬ν•˜λ©΄ not 을 μ˜λ―Έν•©λ‹ˆλ‹€.
  • μœ„μ—μ„œ μ„€λͺ…λ“œλ Έλ“―이, λ°±μŠ¬λŸ¬μ‹œ(\)λ₯Ό 두 번 써주어야 정상적인 검사가 κ°€λŠ₯ν•©λ‹ˆλ‹€.

 

μœ„ μ •κ·œ ν‘œν˜„μ‹μ„ 더 κ°„λ‹¨ν•˜κ²Œ 쀄이면 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

s = s.replaceAll("[^\\w\\-_.]*", "");
  • 2λ‹¨κ³„μ˜ μœ νš¨μ„± κ²€μ‚¬μ—λŠ” μΌμΉ˜ν•˜μ§€ μ•Šμ§€λ§Œ, 문제의 1λ‹¨κ³„μ—μ„œ 이미 λͺ¨λ“  문자λ₯Ό μ†Œλ¬Έμžλ‘œ μΉ˜ν™˜ν–ˆκΈ° λ•Œλ¬Έμ— μœ„μ™€ 같이 \w(μ•ŒνŒŒλ²³μ΄λ‚˜ 숫자)λ₯Ό μž‘μ„±ν•΄μ£Όμ–΄λ„ κ²°κ³ΌλŠ” λ™μΌν•©λ‹ˆλ‹€.
  • μœ„ μ •κ·œ ν‘œν˜„μ‹μ€ λ¬Έμžμ—΄μ— λŒ€λ¬Έμžκ°€ μ‘΄μž¬ν•˜λ©΄, λŒ€λ¬ΈμžλŠ” μ œκ±°ν•΄μ£Όμ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

 

 

 

 

🎢 3단계 new_idμ—μ„œ λ§ˆμΉ¨ν‘œ(.)κ°€ 2번 이상 μ—°μ†λœ 뢀뢄을 ν•˜λ‚˜μ˜ λ§ˆμΉ¨ν‘œ(.)둜 μΉ˜ν™˜ν•©λ‹ˆλ‹€.

 

μœ„μ—μ„œ 핡심 ν‚€μ›Œλ“œλŠ” 2번 이상 μ—°μ†λœ λΆ€λΆ„μž…λ‹ˆλ‹€.

μœ„μ˜ μœ νš¨μ„± κ²€μ‚¬λŠ” μ •κ·œ ν‘œν˜„μ‹μ„ μ‚¬μš©ν•˜μ§€ μ•Šκ³  κ°€λŠ₯ν•˜κ² μ§€λ§Œ, μ½”λ“œκ°€ λ³΅μž‘ν•˜κ²Œ 될 거라고 μƒκ°ν•©λ‹ˆλ‹€...πŸ€”

 

λ”°λΌμ„œ μœ„ 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ 횟수 λ˜λŠ” λ²”μœ„λ₯Ό λ‚˜νƒ€λ‚΄λŠ” {} 기호λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

// "[.]{2.}"
s = s.replaceAll("\\.{2,}", ".");

 

  • 주석 처리된 μ •κ·œ ν‘œν˜„μ‹κ³Ό replaceAll에 μž‘μ„±λœ μ •κ·œ ν‘œν˜„μ‹μ„ λ™μΌν•œ μ˜λ―Έμž…λ‹ˆλ‹€.
  • \\. (λ§ˆμΉ¨ν‘œ)
  • {2,} 2회 이상

 

 

 

 

🎢 4단계 new_idμ—μ„œ λ§ˆμΉ¨ν‘œ(.)κ°€ μ²˜μŒμ΄λ‚˜ 끝에 μœ„μΉ˜ν•œλ‹€λ©΄ μ œκ±°ν•©λ‹ˆλ‹€.

 

μœ„μ—μ„œ λ§ˆμΉ¨ν‘œ(.)κ°€ μ²˜μŒμ΄λ‚˜ 끝에 μœ„μΉ˜ν•œλ‹€λ©΄ 제거λ₯Ό ν•΄μ•Όν•˜λŠ”λ°μš”, λ§Œμ•½ μ •κ·œ ν‘œν˜„μ‹μ„ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ ..

첫 λ¬Έμžμ™€ λ§ˆμ§€λ§‰ λ¬Έμžκ°€ λ§ˆμΉ¨ν‘œ(.) 인지 μ—¬λΆ€λ₯Ό νŒλ‹¨ν•΄μ„œ μ œκ±°ν•΄μ•Ό ν•©λ‹ˆλ‹€.

 

ν•˜μ§€λ§Œ, μ •κ·œ ν‘œν˜„μ‹μ„ 톡해 κ°„λ‹¨νžˆ 해결이 κ°€λŠ₯ν•©λ‹ˆλ‹€.

s = s.replaceAll("^[.]|[.]$", "");
  • ^ λŠ” 문자의 μ‹œμž‘μ„ μ˜λ―Έν•©λ‹ˆλ‹€.
  • [.] λŠ” . 을 μ˜λ―Έν•˜κ³ , 즉 ^[.] λŠ” λ¬Έμžμ—΄μ΄ λ§ˆμΉ¨ν‘œ(.)둜 μ‹œμž‘ν•˜λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.
  • | λŠ” νŒ¨ν„΄ μ•ˆμ—μ„œ or μ—°μ‚°(μ²˜μŒμ΄λ‚˜ 끝에 μœ„μΉ˜ν•˜λŠ” 경우)을 μ˜λ―Έν•©λ‹ˆλ‹€.
  • [.]$ λŠ” λ¬Έμžμ—΄μ˜ 끝이 λ§ˆμΉ¨ν‘œ(.)둜 λλ‚˜λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.

 

2022.02.07 μΆ”κ°€

  • μœ„ μ •κ·œ ν‘œν˜„μ‹μ€ λŒ€κ΄„ν˜Έλ₯Ό μƒλž΅ν•˜κ³ λ‹€μŒκ³Ό 같이 λ‚˜νƒ€λ‚Ό 수 μžˆμŠ΅λ‹ˆλ‹€.
s = s.replaceAll("^.|.$", "");

 

 

 

🎢 6단계 new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자λ₯Ό μ œμ™Έν•œ λ‚˜λ¨Έμ§€ λ¬Έμžλ“€μ„ λͺ¨λ‘ μ œκ±°ν•©λ‹ˆλ‹€. λ§Œμ•½ 제거 ν›„ λ§ˆμΉ¨ν‘œ(.)κ°€ new_id의 끝에 μœ„μΉ˜ν•œλ‹€λ©΄ 끝에 μœ„μΉ˜ν•œ λ§ˆμΉ¨ν‘œ(.) 문자λ₯Ό μ œκ±°ν•©λ‹ˆλ‹€.

 

μœ„μ—μ„œ λ§ˆμΉ¨ν‘œ(.)κ°€ 끝에 μœ„μΉ˜ν•˜λŠ” κ²½μš°λŠ” 4λ‹¨κ³„μ—μ„œ μž‘μ„±μ„ ν•΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

λ”°λΌμ„œ 6λ‹¨κ³„μ˜ 전체 검사λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ½”λ“œλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

        private KakaoId notGraterThan16() {
            if (s.length() >= 16) {
                s = s.substring(0, 15);
            }
            s = s.replaceAll("[.]$", "");
            return this;
        }

 

 

μ΄μƒμœΌλ‘œ μžλ°” μ •κ·œ ν‘œν˜„μ‹μ— λŒ€ν•΄ μ‚΄νŽ΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€!

μ •κ·œ ν‘œν˜„μ‹μ€ 정말 자주 μ‚¬μš©ν•˜λŠ” 것은 μ•„λ‹ˆμ§€λ§Œ, μ•Œμ•„λ‘λ©΄ κΌ­ μ‚¬μš©ν•΄μ•Ό ν•  λ•Œκ°€ μžˆλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

λ”°λΌμ„œ μ •κ·œ ν‘œν˜„μ‹μ— λŒ€ν•΄ μ–΄λŠμ •λ„ μ΄ν•΄ν•˜κ³ , 써먹을 수 μžˆμ„ μ •λ„λ‘œλŠ” 곡뢀λ₯Ό ν•˜λŠ” 것이 쒋을 것 κ°™μŠ΅λ‹ˆλ‹€. 

 

λ°˜μ‘ν˜•

λŒ“κΈ€