본문 바로가기
프로그래밍/JAVA

초보 자바 프로그래밍(40) - 정규표현식과 문자열 처리

by 머니테크리더 2023. 5. 4.
반응형

정규표현식과 문자열처리 대표 이미지
정규표현식과 문자열처리 대표 이미지

🔖 INDEX

     

     

    문자열 검색

    1. Pattern 클래스

    Pattern 클래스는 정규 표현식을 컴파일하여 패턴을 생성합니다. 정규 표현식을 사용하기 위해 먼저 Pattern 객체를 생성해야 합니다.

    // 정규 표현식 패턴을 정의합니다.
    String regex = "\\d+";
    // 패턴을 컴파일하여 Pattern 객체를 생성합니다.
    Pattern pattern = Pattern.compile(regex);

     

    2. Matcher 클래스

    Matcher 클래스는 패턴을 입력 문자열에 적용하여 일치하는 부분을 찾습니다. Pattern 객체를 사용하여 Matcher 객체를 생성할 수 있습니다.

    String input = "There are 12 months in a year.";
    // Matcher 객체를 생성하여 입력 문자열에서 패턴을 검색합니다.
    Matcher matcher = pattern.matcher(input);

     

    3. 패턴 검색

    Matcher 클래스의 find() 메서드를 사용하여 입력 문자열에서 패턴이 일치하는 부분을 찾을 수 있습니다. find() 메서드는 일치하는 부분이 발견되면 true를 반환하고, 그렇지 않으면 false를 반환합니다.

    // 패턴이 일치하는지 확인하고 결과를 출력합니다.
    if (matcher.find()) {
        System.out.println("Match found!");
    } else {
        System.out.println("No match found.");
    }

     

    4. 일치하는 문자열 추출

    일치하는 부분을 찾은 후, Matcher 클래스의 group() 메서드를 사용하여 일치하는 문자열을 추출할 수 있습니다.

    // 패턴이 일치하는 부분을 모두 찾아 출력합니다.
    while (matcher.find()) {
        String matched = matcher.group();
        System.out.println("Matched: " + matched);
    }
    // 결과:
    // Matched: 12

     

    5. 예제 코드

    다음은 정규 표현식을 사용하여 문자열에서 숫자를 찾는 예제 코드입니다. 주석을 통해 각 단계를 설명하였습니다.

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class RegexExample {
        public static void main(String[] args) {
            // 검색할 문자열을 정의합니다.
            String input = "There are 12 months in a year, and 365 days in a year.";
    
            // 정규 표현식 패턴을 정의합니다. 여기서는 숫자를 찾는 패턴인 "\d+"를 사용합니다.
            String regex = "\d+";
    
            // 패턴을 컴파일하여 Pattern 객체를 생성합니다.
            Pattern pattern = Pattern.compile(regex);
    
            // Matcher 객체를 생성하여 입력 문자열에서 패턴을 검색합니다.
            Matcher matcher = pattern.matcher(input);
    
            // 패턴이 일치하는 부분을 모두 찾아 출력합니다.
            while (matcher.find()) {
                // group() 메소드를 사용하여 일치하는 문자열을 추출합니다.
                String matched = matcher.group();
                // 일치하는 문자열을 출력합니다.
                System.out.println("Matched: " + matched);
            }
            // 결과:
            // Matched: 12
            // Matched: 365
        }
    }

     

     

    문자열 치환

    1. replaceAll() 메서드

    문자열에서 정규 표현식에 일치하는 부분을 다른 문자열로 치환하려면 Matcher 클래스의 replaceAll() 메서드를 사용할 수 있습니다. 다음 코드는 replaceAll() 메서드를 사용하여 문자열에서 숫자를 다른 문자열로 치환하는 예입니다.

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class RegexReplaceExample {
        public static void main(String[] args) {
            // 치환할 문자열을 정의합니다.
            String input = "There are 12 months in a year, and 365 days in a year.";
    
            // 정규 표현식 패턴을 정의합니다. 여기서는 숫자를 찾는 패턴인 "\\d+"를 사용합니다.
            String regex = "\\d+";
    
            // 패턴을 컴파일하여 Pattern 객체를 생성합니다.
            Pattern pattern = Pattern.compile(regex);
    
            // Matcher 객체를 생성하여 입력 문자열에서 패턴을 검색합니다.
            Matcher matcher = pattern.matcher(input);
    
            // 정규 표현식에 일치하는 모든 부분을 "X" 문자열로 치환합니다.
            String replaced = matcher.replaceAll("X");
    
            // 치환된 문자열을 출력합니다.
            System.out.println(replaced);
            // 결과: "There are X months in a year, and X days in a year."
        }
    }

     

    2. replaceFirst() 메서드

    Matcher 클래스의 replaceFirst() 메서드를 사용하여 정규 표현식에 일치하는 첫 번째 부분만 다른 문자열로 치환할 수 있습니다. 다음 코드는 replaceFirst() 메서드를 사용하여 문자열에서 숫자 중 첫 번째 숫자만 다른 문자열로 치환하는 예입니다.

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class RegexReplaceFirstExample {
        public static void main(String[] args) {
            // 치환할 문자열을 정의합니다.
            String input = "There are 12 months in a year, and 365 days in a year.";
    
            // 정규 표현식 패턴을 정의합니다. 여기서는 숫자를 찾는 패턴인 "\\d+"를 사용합니다.
            String regex = "\\d+";
    
            // 패턴을 컴파일하여 Pattern 객체를 생성합니다.
            Pattern pattern = Pattern.compile(regex);
    
            // Matcher 객체를 생성하여 입력 문자열에서 패턴을 검색합니다.
            Matcher matcher = pattern.matcher(input);
    
            // 정규 표현식에 일치하는 첫 번째 부분만 "X" 문자열로 치환합니다.
            String replaced = matcher.replaceFirst("X");
    
            // 치환된 문자열을 출력합니다.
            System.out.println(replaced);
            // 결과: "There are X months in a year, and 365 days in a year."
        }
    }

     

    문자열 추출

    1. group() 메서드

    정규 표현식을 사용하여 문자열에서 특정 패턴에 일치하는 부분을 추출하려면 Matcher 클래스의 group() 메서드를 사용할 수 있습니다. 다음 코드는 정규 표현식을 사용하여 문자열에서 패턴에 일치하는 부분을 추출하는 예입니다.

    import java.util.regex.Pattern;
    import java.util.regex.Matcher;
    
    public class RegexGroupExample {
        public static void main(String[] args) {
            String input = "John Doe (johndoe@gmail.com), Jane Smith (janesmith@yahoo.com)";
            String regex = "\\w+@\\w+\\.\\w{2,4}"; // 이메일 주소를 찾는 정규 표현식
    
            // Pattern 객체를 생성합니다.
            Pattern pattern = Pattern.compile(regex);
    
            // Matcher 객체를 생성하여 입력 문자열에서 패턴을 검색합니다.
            Matcher matcher = pattern.matcher(input);
    
            // 패턴에 일치하는 이메일 주소를 추출하여 출력합니다.
            while (matcher.find()) {
                System.out.println("Found email: " + matcher.group());
            }
            // 결과: johndoe@gmail.com, janesmith@yahoo.com
        }
    }

     

     

    문자열 검증

    1. matches() 메서드

    정규 표현식을 사용하여 문자열이 특정 패턴에 일치하는지 확인하려면 Matcher 클래스의 matches() 메서드를 사용할 수 있습니다. 다음 코드는 정규 표현식을 사용하여 문자열이 패턴에 일치하는지 확인하는 예입니다.

    import java.util.regex.Pattern;
    import java.util.regex.Matcher;
    
    public class RegexMatchesExample {
        public static void main(String[] args) {
            String input = "123-45-6789";
            String regex = "\\d{3}-\\d{2}-\\d{4}"; // 주민등록번호 형식을 검사하는 정규 표현식
    
            // Pattern 객체를 생성합니다.
            Pattern pattern = Pattern.compile(regex);
    
            // Matcher 객체를 생성하여 입력 문자열에서 패턴을 검색합니다.
            Matcher matcher = pattern.matcher(input);
    
            // 문자열이 정규 표현식 패턴에 일치하는지 확인합니다.
            if (matcher.matches()) {
                System.out.println("Valid SSN format.");
            } else {
                System.out.println("Invalid SSN format.");
            }
            // 결과: Valid SSN format.
        }
    }

     

    그룹화 및 그룹 추출

    1. 정규 표현식에서 괄호를 사용한 그룹화

    정규 표현식에서 괄호를 사용하여 표현식의 일부분을 그룹화할 수 있습니다. 이를 통해 추출하거나 치환할 대상을 더 구체적으로 지정할 수 있습니다. 다음 코드는 정규 표현식에서 그룹화를 사용하여 문자열에서 패턴에 일치하는 부분을 추출하는 예입니다.

    import java.util.regex.Pattern;
    import java.util.regex.Matcher;
    
    public class RegexGroupingExample {
        public static void main(String[] args) {
            String input = "2022-04-20";
            String regex = "(\\d{4})-(\\d{2})-(\\d{2})"; // 년-월-일 형식의 날짜를 그룹화하는 정규 표현식
    
            // Pattern 객체를 생성합니다.
            Pattern pattern = Pattern.compile(regex);
    
            // Matcher 객체를 생성하여 입력 문자열에서 패턴을 검색합니다.
            Matcher matcher = pattern.matcher(input);
    
            // 패턴에 일치하는 부분의 각 그룹을 추출하여 출력합니다.
            if (matcher.find()) {
                System.out.println("Year: " + matcher.group(1));
                System.out.println("Month: " + matcher.group(2));
                System.out.println("Day: " + matcher.group(3));
            }
            // 결과: Year: 2022, Month: 04, Day: 20
        }
    }

     

    출전 후방 탐색 (Lookaround)

    1. 전방 탐색 (Lookahead) 및 후방 탐색 (Lookbehind)

    정규 표현식에서 전방 탐색(lookahead) 및 후방 탐색(lookbehind)은 특정 패턴을 찾을 때 앞 또는 뒤의 문자열을 확인하고 싶을 때 사용합니다. 전방 탐색은 (?=...)로 표현하며, 후방 탐색은 (?<=...)로 표현합니다. 다음 코드는 전방 탐색과 후방 탐색을 사용하여 문자열에서 패턴을 찾는 예입니다.

    import java.util.regex.Pattern;
    import java.util.regex.Matcher;
    
    public class RegexLookaroundExample {
        public static void main(String[] args) {
            String input = "price: 1000 won, discount: 500 won";
            String regex = "\\d+(?= won)"; // "won"이라는 단어 앞에 있는 숫자를 찾는 정규 표현식
    
            // Pattern 객체를 생성합니다.
            Pattern pattern = Pattern.compile(regex);
    
            // Matcher 객체를 생성하여 입력 문자열에서 패턴을 검색합니다.
            Matcher matcher = pattern.matcher(input);
    
            // 패턴에 일치하는 부분을 찾아 출력합니다.
            while (matcher.find()) {
                System.out.println("Found: " + matcher.group());
            }
            // 결과: 1000, 500
    
            String input2 = "USD100, EUR200, KRW300";
            String regex2 = "(?<=USD)\\d+"; // "USD"라는 단어 뒤에 있는 숫자를 찾는 정규 표현식
    
            // Pattern 객체를 생성합니다.
            Pattern pattern2 = Pattern.compile(regex2);
    
            // Matcher 객체를 생성하여 입력 문자열에서 패턴을 검색합니다.
            Matcher matcher2 = pattern2.matcher(input2);
    
            // 패턴에 일치하는 부분을 찾아 출력합니다.
            if (matcher2.find()) {
                System.out.println("Found: " + matcher2.group());
            }
            // 결과: 100
        }
    }

     

     

    정규 표현식 플래그 사용

    정규 표현식에서 플래그를 사용하면, 특정 옵션을 적용하여 패턴 매칭을 수행할 수 있습니다. 주요 플래그는 다음과 같습니다.

    • CASE_INSENSITIVE (Pattern.CASE_INSENSITIVE 또는 (?i)): 대소문자를 구분하지 않고 매칭합니다.
    • MULTILINE (Pattern.MULTILINE 또는 (?m)): 여러 줄에 걸쳐 패턴을 매칭합니다.
    • DOTALL (Pattern.DOTALL 또는 (?s)): 줄바꿈 문자를 포함한 모든 문자를.(dot)으로 매칭합니다.

    다음 코드는 정규 표현식 플래그를 사용하여 문자열에서 패턴을 찾는 예입니다.

    import java.util.regex.Pattern;
    import java.util.regex.Matcher;
    
    public class RegexFlagExample {
        public static void main(String[] args) {
            String input = "Hello World\nhello world";
            String regex = "(?i)hello"; // 대소문자를 구분하지 않는 정규 표현식
    
            // Pattern 객체를 생성하고 플래그를 설정합니다.
            Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
    
            // Matcher 객체를 생성하여 입력 문자열에서 패턴을 검색합니다.
            Matcher matcher = pattern.matcher(input);
    
            // 패턴에 일치하는 부분을 찾아 출력합니다.
            while (matcher.find()) {
                System.out.println("Found: " + matcher.group());
            }
            // 결과: Hello, hello
        }
    }

     

    문자열에서 특정 패턴 제거

    문자열에서 특정 패턴을 제거하려면, 정규 표현식을 사용하여 해당 패턴을 찾은 후 빈 문자열로 치환합니다. 다음 코드는 정규 표현식을 사용하여 문자열에서 패턴을 제거하는 예입니다.

    import java.util.regex.Pattern;
    
    public class RegexRemoveExample {
        public static void main(String[] args) {
            String input = "This is a test123 string.";
            String regex = "\\d+"; // 숫자를 찾는 정규 표현식
    
            // Pattern 객체를 생성합니다.
            Pattern pattern = Pattern.compile(regex);
    
            // 입력 문자열에서 패턴에 일치하는 부분을 제거합니다.
            String result = pattern.matcher(input).replaceAll("");
    
            System.out.println("Result: " + result);
            // 결과: This is a test string.
        }
    }

    댓글