인프런 커뮤니티 질문&답변

yoongdoo0819님의 프로필 이미지
yoongdoo0819

작성한 질문수

스프링부트 JUnit 테스트 - 시큐리티를 활용한 Bank 애플리케이션

정규표현식 실습

해결된 질문

작성

·

358

0

안녕하세요 강사님.

 

정규표현식 실습 강의에서 궁금한 점이 있습니다.

 

한글만 가능하도록 정규표현식을 작성하는 것을 "^[가-힣]+$" 라고 말씀해주셨습니다.

 

궁금한 점은 "[가-힣]+" 라고 작성하면 한글 외의 글자가 들어와도 true라고 반환하는 케이스가 어느 경우인지 입니다.

 

"[가-힣]+" 라고 작성해도 띄어쓰기와 ""일때도 모두 false를 반환합니다.

 

즉, "^[가-힣]+$" 대신에 "[가-힣]+" 라고 할 경우 어떠한 케이스들을 걸러내지 못하는지 궁금합니다.

 

 

감사합니다.

답변 1

1

최주호님의 프로필 이미지
최주호
지식공유자

결론 부터 말씀드리면, 정규표현식은 서로 다르지만, matches 메서드 때문에 동일하게 보이는 것입니다.

 

  1. 정규표현식

  • ^[가-힣]+$: 이 패턴은 문자열의 시작(^)부터 끝($)까지 한글 문자(가-힣)로만 이루어져 있어야 합니다. 문자열 내에 다른 문자가 있으면 패턴에 일치하지 않습니다.

  • [가-힣]+: 이 패턴은 문자열에 한글 문자(가-힣)가 하나 이상 연속해서 나타나는 경우에 패턴에 일치합니다. 문자열 내에 다른 문자가 있어도, 한글 문자가 하나 이상 있으면 일치합니다.

  1. matches 메서드

    Pattern.matches() 메서드를 사용할 때, 두 패턴은 다른 결과를 반환할 수 있습니다.

    예를 들어, "안녕하세요abc"라는 문자열에 대해 테스트한다면:

    • ^[가-힣]+$ 패턴은 일치하지 않습니다. 왜냐하면 문자열이 영어 문자(abc)를 포함하고 있기 때문입니다.

    • [가-힣]+ 패턴은 Pattern.matches() 메서드와 함께 사용되면 일치하지 않습니다. 왜냐하면 Pattern.matches()는 전체 문자열이 패턴과 일치해야 true를 반환하기 때문입니다. 하지만, 다른 메서드를 사용하면 일치한다고 판단할 수 있습니다. 예를 들어, Matcher.find()를 사용하면 문자열 내에 한글 문자가 하나 이상 있으면 true를 반환합니다.

public class HelloTest {

    @Test
    public void ko_test(){
        String pattern = "^[가-힣]+$";
        String str = "안녕하세요abc";

        boolean result = Pattern.compile(pattern).matcher(str).find();
        System.out.println(result); // false
    }

    @Test
    public void ko2_test(){
        String pattern = "[가-힣]+";
        String str = "안녕하세요abc";

        boolean result = Pattern.compile(pattern).matcher(str).find();
        System.out.println(result); // true
    }
}
  1. 자바의 정규표현식 검사 라이브러리

    Validation 라이브러리는 주로 전체 문자열이 패턴과 완전히 일치하는지 검사하는 방식에 가깝습니다. 즉, Pattern.matches()와 유사한 방식으로 작동합니다.

import javax.validation.constraints.Pattern

 

yoongdoo0819님의 프로필 이미지
yoongdoo0819

작성한 질문수

질문하기