이러쿵저러쿵


개발을 하다 보면 한글을 별도로 처리해야하는 경우가 발생합니다.


문자열에 한글이 포함되어있느냐? 포함되어 있지 않느냐를 따져서 처리를 다르게 하는 경우가 있지요?


예를 들면 닉네임을 입력받았는데, 이 닉네임이 한글 닉네임인지(한글이 포함된 닉네임인지), 아니면 영문 닉네임인지 구분하기를 원합니다.


가장 보편적이고, 간단한 방법은 JAVA 정규식을 활용하는 방법입니다.



String nickname = "닉Name좋아요123";


if(nickname.matches(".*[ㄱ-ㅎㅏ-ㅣ가-힣]+.*")) {

// 한글이 포함된 문자열

} else {

// 한글이 포함되지 않은 문자열

}



간단합니다. 정규식만 잘 이해한다면 어렵지 않은 문장입니다. JAVA 정규식은 복잡한 패턴을 쉽게 처리할 수 있도록 도와줍니다.


이번 포스팅은 정규식에 관한 것은 아니므로, 자세한 설명은 하지 않고, 위의 예제에서 한글이 포함된 문자열을 찾아내는 패턴에 대한 정규식만 간단히 설명하도록 하겠습니다.


* nickname.matches(".*[ㄱ-ㅎㅏ-ㅣ가-힣]+.*")


nickname 이라는 문자열 내에 matches 메서드 내의 정규식 표현에 부합하는 표현이 있는지 찾습니다. 만약 있다면 matches 매서드는 true를 반홥합니다.

다시 한 번 정리하면 matches 메서드는 간단히 matches 메서드 파라미터 내의 정규식 표현과 일치하는 텍스트가 호출한 문자열 객체 내에 있는 경우 true를 반환합니다.



표현식 

설명 

 .

 마침표(.)는 임의의 한 문자를 의미합니다. 어떤 문자든 상관없습니다. (단, \는 제외)

 반드시 하나의 글자가 있어야 합니다.


 Ex.)

 ab. -> abc, abd, ab5 (O)

 ab. -> abcd, ab (X)

 *

 별표(애스터리스크, Asterisk)는 임의의 문자열을 의미합니다.

 공백(문자열이 없는 경우)도 포함합니다.


 Ex.)

 a*b -> ab, acccccb, aob (O)

 

 단 JAVA에서는 *abc 와 같이 * 앞에 어떤 문자(열)도 없는 경우는 사용이 불가능합니다. 반드시 앞에 최소한의 한 문자가 위치해야 합니다. 그래서 위의 정규식은 * 앞에 .를 배치시킨 .* 형태로 사용하였습니다.

 []

 [] 괄호 내의 문자열 집합을 의미합니다. 문자열 집합을 범위로 표현할 때는 - (하이픈)을 사용합니다.

 [ㄱ-ㅎ] 는 기역(ㄱ) 부터 히읗(ㅎ)까지의 한글 자음을 의미합니다.

 [ㅏ-ㅣ] 는 ㅏ,ㅑ,ㅓ,ㅕ ... ㅡ,ㅣ까지의 한글 모음을 의미합니다.

 [가-힣] 는 한글 가 부터 힣 까지 자음과 모음을 조합하여 만들어낼 수 있는 모든 한글을 의미합니다.

 

 위의 조건은 다음과 같이 하나의 괄호 내에 포함시킬 수 있습니다.

 [ㄱ-ㅎㅏ-ㅣ가-힣] 한글 모음, 자음 뿐만 아니라, 조합하여 만들어낼 수 있는 모든 한글 패턴을 의미합니다.

 +

 바로 앞의 문자가 하나 이상 반복됨을 의미합니다.

 바로 앞의 문자가 [ㄱ-ㅎㅏ-ㅣ가-힣] 이므로, 한글이 하나 이상 반복됨을 의미합니다.

 


위의 몇가지 정규식 표현을 조합하여 한글만 입력받을 수 있도록 하였습니다.

패턴을 간단히 이해하자면 어떤 문자열이 존재하는데 한글(모음, 자음, 조합 형태)가 포함(반복 포함)되는지 체크하고 있는 형태입니다.


만약 한글 순수 자음 및 모음은 제외하고, 완성형 한글만 체크하겠다고 하면 [가-힣] 만 이용하시면 됩니다.



이로써, 간단하게 JAVA에서 문자열에 한글 포함 여부를 체크할 수 있습니다.



간단히 몇가지만 더 알아보겠습니다.^^


먼저 정규식을 작성하다 보면 정규식 표현 문법 자체에 문제가 있을 수도 있는데요.

정규식 문법이 올바르지 않아 오류가 발생하면 예외(Exception)를 발생시킵니다.


정규식 패턴 오류는 PatternSyntaxException 으로 잡아서 확인 및 처리할 수 있습니다.


// 패턴식에 대한 예외 처리 하기


try {

String nickname = "닉Name좋아요123";


if(nickname.matches(".*[ㄱ-ㅎㅏ-ㅣ가-힣]+.*")) {

// 한글이 포함된 문자열

} else {

// 한글이 포함되지 않은 문자열

}

} catch (PatternSyntaxException e) {

// 정규식에 오류가 있는 경우에 대한 처리

System.err.println("An Exception Occured");

e.printStackTrace();

}





위의 한글 패턴 찾는 방식이 보편적인 방법이고, 완벽한 방법입니다. (더 이상 다른 방법은 현재로써는 생각하지 않으셔도 됩니다.)


하지만, 조금 다른 방법으로 한글 포함 여부를 찾아낼 수도 있습니다.


아래의 방법은 조금 생각의 발상을 전환하여 간단히 한글을 찾아내는 방법입니다. (단, 아래는 제약사항이 조금 있습니다.)


만약 다음과 같이 가정해 보겠습니다.


* JAVA 소스 코드 상에 한글의 입력이 불가능하다!

* 우리가 만든 서비스에서 사용자들은 닉네임을 한글 또는 영문으로 사용할 수 있지만, 영문인 경우, 소문자(또는 최소한 하나의 글자는 소문자)로 입력 받는다.




String nickname = "hello_name";


if(nickname.equals(nickname.toUpperCase())) { 

// 한글이 포함된 문자열 (또는 영문 소문자가 포함되어 있지 않은 문자열)

} else {

// 한글이 포함되지 않은 문자열

}



소스 코드는 닉네임 문자열과 자신의 닉네임을 모두 대문자로 변환한 문자열(toUpperCase())과 비교를 하고 있습니다.

한글 또는 영문 대문자는 toUpperCase() 메서드를 적용해도 변화가 없습니다. 이 점을 활용하여 한글을 찾아내는 방법입니다.


그렇기 때문에 원 문자열과 toUpperCase()를 적용한 문자열이 한글로만 되어 있거나 영문 대문자로만 이루어진 경우에는 위의 if조건을 만족시킵니다.

nickname 변수에 최소한 하나의 소문자만 포함되어 있더라도 toUpperCase()에 의해 대문자로 변환되면서 if조건은 false를 리턴하게 됩니다.





JAVA 정규식에 대해 더 자세히 알아보기

http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html



 

저작자 표시 비영리 변경 금지
신고

Comment +0

티스토리 툴바