반응형
아~~~ 정말 오랜만에 글을 쓴다.

애기들 공부 가르키다가, 새롭게 기억이 쏙쏙 돛아나는 정규식~ 매번 공부해야겠다고 마음은 먹지만 못하는 이놈.ㅋㅋㅋ

정규식이란 놈은 골때린다. 그 이유인즉, Java, 기타 툴, DB 등등 각각의 엔진마다 조금씩 다르기 때문이다.

휴~~ 그래서 우선 Java에서 쓰이는 정규식만 정리를 해보도록 하자.

머 내가 정리한다기 보다는 Java API에 있는것들 어느정도 해석해서 적어보도록 하겠다.

테스트를 위해서는 아래 코드를 활용하면 쉽게 테스트 가능하다.


 public class Test {
 public static void main(String argsp[]) {

  String tmp = "0A가B1abc나2C32dd2ⓔ34DDD다d";

  for (int i = 0; i < tmp.length(); i++) {
   String tt = tmp.substring(i, i + 1);
   if (tt.matches("
\\p{Lower}")) {   // ==> 요기에 정규표현식을 섞어서 넣어주면 쉽게 테스트가능하다.
    System.out.println(tt);
   }
  }
 }
}


우선 Java에서 아주 쉽게 사용할 수 있는것 부터 소개 하도록 하겠다.

정규식에 대해서 기타 다른 프로그램도 동일하게 적용되는 부분이다. API에서는 이 부분을 "Predefined character classes"

라고 명명하였다.

[1] Predefined character classes

.       Any character                                                 : 어떤 문자든 . 으로 표현한다.
\d       A digit: [0-9]                            : 0부터 9까지의 숫자
\D       A non-digit: [^0-9]                       : 0~9까지의 숫자 가 아닌 것
\s       A whitespace character: [ \t\n\x0B\f\r]    : 띄워쓰기
\S       A non-whitespace character: [^\s]          : 띄워쓰기가 아닌문자
\w       A word character: [a-zA-Z_0-9]            : 대.소문자 영문자 + 숫자
\W       A non-word character: [^\w]               : (대.소문자 영문자 + 숫자) 가 아닌것

위의 Pattern은 모든 정규식에서 공통적으로 이용되는 정규식이기 때문에 외우두면 개발하기 매우 편하다.

다음으로 POSIX 에서 정의한 정규표현식을 알아보도록 하자. POSIX에서 정의한 정규표현식도 Java에서는 사용가능하다.

[2] POSIX character classes

\p{Lower} A lower-case alphabetic character: [a-z]                  : 영어 소문자
\p{Upper} An upper-case alphabetic character:[A-Z]                  : 영어 대문자
\p{ASCII} All ASCII:[\x00-\x7F]                                  : 아스키코드로 표현가능한 모든 문자
\p{Alpha} An alphabetic character:[\p{Lower}\p{Upper}]            : 모든 알파벳(대.소문자 포함)
\p{Digit} A decimal digit: [0-9]                                  : 0~9까지의 숫자
\p{Alnum} An alphanumeric character:[\p{Alpha}\p{Digit}]          : 알파뉴메릭(대.소문자 영문자 + 숫자)
\p{Punct} Punctuation: One of !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~    : 키보드로 표현가능한 특수문자
\p{Graph} A visible character: [\p{Alnum}\p{Punct}]                : 알파뉴메릭 + 키보드로 표현가능한 특수문자
\p{Print} A printable character: [\p{Graph}\x20]                   : 알파뉴메릭 + 키보드로 표현가능한 특수문자
\p{Blank} A space or a tab: [ \t]                                 : 띄워쓰기 또는 Tab
\p{Cntrl} A control character: [\x00-\x1F\x7F]                     : 요건 나도 뭔지 잘 모름 ????
\p{XDigit} A hexadecimal digit: [0-9a-fA-F]                         : 16진수로 표현가능한 문자
\p{Space}

A whitespace character: [ \t\n\x0B\f\r]                 : Tab , Enter, Carrige Return 문자



위의 POSIX Pattern 자체가 좀 더 눈으로 식별하기는 쉬운 느낌이 든다.

[1] 과 [2] 외에도 여러가지 정규 표현식 들이 존재한다.

하지만, 내 생각에는 [1]과 [2]의 표현식 정도면 외우고 있고 적당히 조합을 하면 왠만한 문자열 패턴을 찾는

것은 쉬울것이라 생각한다.



 마지막으로, 한글을 어떻게 하면 걸러낼 수 있을까? 라는 의문점이 든다. 모든 정규표현식은 한글이 아닌 US 문자를 기준

으로 구현되었기 때문에 한글의 경우는 과연 어떻게 할까?

우선 정답은 다음과 같다.


matches("[ㄱ-ㅎ|ㅏ-ㅣ|가-힣]")

대략 보면 다음과 같다.

(1) 모든 한글은 ㄱ 으로 시작해서 ㅎ 으로 끝난다.
(2) 모든 모음은 ㅏ 로 시작해서 ㅣ 로 끝난다.
(3) (1)과 (2)을 모두 조합해 보았을때 모든 문자는 가 로 시작해서 힣 으로 끝이 난다.



정규표현식은 잘쓰면 복잡한 코드를 상당히 줄 일 수 있는 아주 유용한 표현식이다. 어느정도 익혀 놓는다면

개발자가 퀀텀점프 할 수 있는 좋은 계기가 될 것이라 생각한다.


                                                                                            - 2012.01.20 랑이씀 -


반응형

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

ShellScript를 이용한 jar파일만들기  (0) 2012.08.09
JAVA에서 윈도우 명령어 실행하기  (0) 2012.06.14
[ Vector와 ArrayList의 차이점]  (2) 2010.11.22
POJO(Plain Old Java Object) 란?  (5) 2010.11.05
Abstract Class란?  (0) 2010.09.16

+ Recent posts