해결된 질문
작성
·
352
0
안녕하세요 강사님.
정규표현식 실습 강의에서 궁금한 점이 있습니다.
한글만 가능하도록 정규표현식을 작성하는 것을 "^[가-힣]+$" 라고 말씀해주셨습니다.
궁금한 점은 "[가-힣]+" 라고 작성하면 한글 외의 글자가 들어와도 true라고 반환하는 케이스가 어느 경우인지 입니다.
"[가-힣]+" 라고 작성해도 띄어쓰기와 ""일때도 모두 false를 반환합니다.
즉, "^[가-힣]+$" 대신에 "[가-힣]+" 라고 할 경우 어떠한 케이스들을 걸러내지 못하는지 궁금합니다.
감사합니다.
답변 1
1
결론 부터 말씀드리면, 정규표현식은 서로 다르지만, matches 메서드 때문에 동일하게 보이는 것입니다.
정규표현식
^[가-힣]+$
: 이 패턴은 문자열의 시작(^)부터 끝($)까지 한글 문자(가-힣)로만 이루어져 있어야 합니다. 문자열 내에 다른 문자가 있으면 패턴에 일치하지 않습니다.
[가-힣]+
: 이 패턴은 문자열에 한글 문자(가-힣)가 하나 이상 연속해서 나타나는 경우에 패턴에 일치합니다. 문자열 내에 다른 문자가 있어도, 한글 문자가 하나 이상 있으면 일치합니다.
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
}
}
자바의 정규표현식 검사 라이브러리
Validation 라이브러리는 주로 전체 문자열이 패턴과 완전히 일치하는지 검사하는 방식에 가깝습니다. 즉, Pattern.matches()와 유사한 방식으로 작동합니다.
import javax.validation.constraints.Pattern