JAVA/Regex

[JAVA/Regex] 중복되는 영어 단어 제거

오늘도개발 2024. 10. 24. 15:43

 

 

 - 중복되는 영단어 제거 정규식

"\\b(\\w+)(\\s+\\1\\b)+"

 

  1. \b:
    • 단어의 시작이나 끝 (단어의 경계)
    • 공백, 구두점 등과 같은 비단어 문자와 단어 문자(영문자, 숫자 등) 를 구분 가능 
  2. (\w+):
    • 하나 이상의 단어 문자를 찾습니다.
    • \w는 알파벳 대소문자, 숫자,밑줄(_)을 포함
    • +는 하나 이상의 문자로 이루어진 패턴
    • 이 부분은 그룹으로 지정 ( 그룹 1 )
  3. (\s+\1\b):
    • \s+: 하나 이상의 공백 문자(스페이스, 탭 등) 찾기
    • \1: 그룹 1 의 내용을 참조하는 역할
    • \b: 단어 경계

 

전체적으로 작동하는 방식:

  • 정규식은 먼저 단어 경계에서 시작하고, 그 다음에 단어 문자가 하나 이상 있는지를 확인합니다. 이 문자는 캡처 그룹 (\w+)에 저장

 

  •  공백이 최소 하나 이상 있는지를 확인하고, 그 다음에 방금 캡처한 동일한 단어(\1)가 있는지 확인

 

  • 동일한 단어 뒤에 단어 경계(\b)가 있어야 함(단어의 끝임을 확인).

       * 경계는 중복 단어뒤 다른 단어와 연결되어 있지 않는지 확인

 

 

  요약

  1. 일치하는 패턴 찾기 ( 입력 문자열에서 정규식 패턴이 일치하는 부분을 찾기 )
  2. 중복 단어로 교체 ( 패턴이 일치하는 경우, 이를 첫 번째 캡처 그룹(\1)으로 교체 )

 

  EX> "Hello Hello world" 입력

  • \b(Hello)(\s+Hello\b) 패턴이 일치
  • 첫 번째 단어인 Hello가 캡처
  • 공백 후에 Hello가 다시 등장하므로 Hello 1 단어로 교체
  • 결과: "Hello world"

 

 - 영단어 대소문자 무시 적용

 

* 아래의 패턴을 추가로 적용

Pattern.CASE_INSENSITIVE

 

 

 

 - 전체 코드

 

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Example {

    public static void main(String[] args) {

        Pattern p = Pattern.compile("\\b(\\w+)(\\s+\\1\\b)+", Pattern.CASE_INSENSITIVE);

        Scanner in = new Scanner(System.in);
        int t = Integer.parseInt(in.nextLine());

        for(int i = 0 ; i < t ; i++){
            String input = in.nextLine();
            Matcher m = p.matcher(input);

            while (m.find()) {
                input = input.replaceAll(m.group(), m.group(1));
            }
            System.out.println(input);
        }
        in.close();
    }
}

 

 

실행 결과

 

'JAVA > Regex' 카테고리의 다른 글

[JAVA/Regex] 문자열 유효성 패턴 검증  (0) 2024.10.24