본문 바로가기
개발/.NET

정규식 기본

by 그저그런보통사람 2010. 3. 6.

   정해진 패턴을 사용해서 패턴에 일치하는 데이터 검색을 지원하는 표현식


■ 정규표현식에 쓰이는 특수문자
   1. '.'
      임의의  문자
      ex) s.e -> sae, sbe, sce, sde ...
          .ce -> ace, kce, dce ...
 
   2. '*'
      바로 앞의 문자가 없거나 하나 이상
      ex) s*e -> e, se, see, ssse ...
          abc* -> ab, abc, abcc, abccc ...
          h*im -> im, him, hhim, hhhim ...


   3. '+'
      바로 앞의 문자가 하나 이상
      ex) s+e -> se, sse, ssse ...


   4. '?'
      바로 앞의 문자가 없거나 하나
      ex) th?e -> e, the 이 두가지표현이 유일하겠지.


   5. '^'      (문자열에 대한 녀석)
      바로 뒤의 문자열로 시작.
      ex) ^The.. 뒷부분부터 공백까지 검사. -> The girl is, Theather
          ^a?bc -> bc, abc ...
          ^.e -> he, me, request, settle ...
          ^s.e?.. e는 나와도 되고 안나와도 되고 -> sa, sae, sb, sbe ...


   6. '$'      (문자열에 대한 녀석)
      바로 앞의 문자열로 종료
      ex) a?bc$ -> eeabe, seebc, bc ..
          +.e$ -> onthetoe, bctae, appetittle ...
          s?c+$ -> e, se, ee, eee, seee, seee ...


   7. '[]'
      [] 안에 있는 문자 중 하나
      범위는 '-'로 지정
      ex) [ab]cd -> acd, bcd ..
          [a-z] -> 영문 소문자
          [a-zA-Z] -> 영문자........ 자바스크립트에서 어렵게 구현한 녀석들인데 간편하내~
          [0-9] -> 숫자
          ag[a-z] -> aga, agbcd, agzzz ...

          ^ab[cd]ef -> abcef, abdef ...
          ^[a-zA-Z] -> 영문자로 시작....
                       아이디 검사할 때 첫글자가 영문자와 '_' 만 쓰도록 할때는 ^[a-zA-Z_]
          ^[가-힣]  ->  한글로 시작해야 할 때
          [^a-zA-Z0-9]   ->   ^이 안으로 들어가면 제외의 의미가 된다는거~ 부정의 의미.. 영문자나 숫자로 시작 X
          [a-zA-Z0-9]$ -> 영문자나 숫자로 종료

          "[가-힣]"   ->  한글... 완성형만 가능해.. 가령, ㅋㅋㅋ 같은 녀석은 안된다는 거지.
          "[abc]"  ->   이 안에 있는 문자중에 하나. 즉, a b c 중에 하나의 문자란 말이지.
                        C#문법으로 치면 ("a" || "b" || "c")와 같은 개념이야..


    8. '{}'
       {} 앞의 문자나 문자열 출현 횟수, 스키마에서 min/maxoccur과 같은 개념으로 이해하렴.
       ex) a{2}b -> aab ... a가 꼭 2번 나와야 한다는 뜻.
           a{2,}b -> aab, aaab, aaaab ...  a가 최소 2번 이상 나오도록 하라는 뜻.
           a{2, 3}b -> aab, aaab   ... a는 최소 2번 최대 3번 나오도록 하라는 뜻.


    9. '()'
      ()안에 있는 문자를 그룹화
       ex) a(bc){2} -> abcbc  ... a다음 bc가 2번 나와야 한다는 뜻..
           a(bc)* -> abcbcbc ...  a다음 bc의 출현횟수는 무한대가 가능하다는 뜻.


    10. '|'
        or 연산자.......
        영어로만 아이디를 만들어라?      [a-zA-Z]+    공백이 없는 영어단어
        ex) he|she -> he, she is..
            (he|she)is -> heis, sheis ...


    11. 특수 문자 사용
        ^  []  $  ()  |  *  +  ?  {}  \
        앞에 \ 붙여서 사용
        ex) \*+  -> * 가 하나 이상 포함된 패턴...... * 나 ** 나 *** 별이 무한대로 계속도 가능하고 말야.

            \d : 순수한 숫자, 정수값, 0-9
            \d{2,3}-/d{3,4}-/d{4}  :   전화번호를 찾는 정규식이야... 여기서 하이퍼는 그냥 하이퍼(-)야.
                                       -? 하이퍼뒤에 물음표가 있으면 하이퍼가 있어도 되고 없어도 된다는 뜻.
            \D : 숫자가 아닌 나머지 모든 얘.
            \w : [a-zA-Z0-9] 의 줄임표현.
            \W : [^a-zA-Z0-9] 영문자와 숫자만 아니면 된다는 뜻.
            \s : 공백
            \S : 공백이 아닌 나머지 얘들.
     


    12. 문제
         1) 4.6% 라는 걸 찾겠다.
               [0-9]{1,3}\.?[0-9]*%

 

         2) 전화번호를 찾자.
                \d{2,3}-\d{3,4}-\d{4}
             [0-9]{2,3}-[0-9]{3,4}-[0-9]{4}


         3) url 주소를 가져와보자.
                http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?


         4) 이름 : ( textBox    )
                [가-힣]{2,5}     ->   한글을 최소 2~5까지 입력가능하다는 뜻.


         5) 나이 : ( textBox    )
                [0-9]{1,2}       ->   숫자가 최소 1~2까지 입력가능하다는 뜻.
                1?[0-9]?[0-9]


         6) 민증번호
                [0-9]{6}-[0-9]{7}
             [0-9][0-9][01][0-9][0123][0-9]-[12][0-9]{6}
           


                 ▒



1. 자바에서의 유효성검사를 다시 기억해보자.
   function send()
   {
      var ex = /^[가-힣]{2,5}%;      --> " " 로 감싸면 X, 그럼 문자값이 되버리잖니..
              // 만약 위처럼 이름검사가 아닌 전화번호입력이라면..
                  var ex = /\d{2,3}-\d{3,4}-\d{4};

      if (ex.test(document.all.txtName.value))     --> 닷넷에서의 Match와 비슷한 test()함수
      {
           alert("ok");
      }
      else
      {
           alert("..");
      }
   }



정규식을 이용한 웹 사이트 유효성 검증.


<script type="text/javascript">

var totalchek = function(chek){

var frm = chek;

if(chek.id.value.match(/^[a-z]+[0-9a-zA-Z]{4,12}\w*/g)!=chek.id.value){

alert!("아이디는 첫자리는 영어소문자이고 4자리에서12자리를 입력하세요");

chek.id.value='';

return;

}

if(chek.pw.value.match(/^[a-z][0-9a-zA-Z]{6,12}\w*/g)!=chek.pw.value){

alert!("패스워드는 첫자리는 영어소문자이고 6자리에서12자리를 입력하세요");

chek.pw.value="";

return;

}

if(chek.mail.value.match(/[a-z0-9A-Z]+@[0-9A-Za-z]+(.[a-z]+)+/g)!=chek.mail.value){

alert!("이메일형태는 dark602@hanmail.net와같은 형식입니다.");

chek.mail.value="";

return;

}

if(chek.num.value.match(/^[0-9]*$/g)!=chek.num.value){

alert!("숫자만입력해주세요~!!!!");

chek.num.value="";

return;

}

if(chek.phone.value.match(/^[0][0-9]{1,2}\-[0-9]{3,4}\-[0-9]{4}$/g)!=chek.phone.value){

alert!("0xx or 0x - xxx or xxxx - xxxx의 형태로 입력을 하셔야 합니다.");

chek.phone.value="";

return;

}

if(chek.mphone.value.match(/01[016789]\-[0-9]{3,4}\-[0-9]{4}/g)!=chek.mphone.value){

alert!("핸드폰번호는01x(016789)-(xxx or xxxx)-xxxx의 형태입니다.");

chek.mphone.value="";

return;

}

if(chek.date.value.match(/[0-9]{4}\.[0-9]{2}\.[0-9]{2}/g)!=chek.date.value){

alert!("날자의 형식은 xxxx.xx.xx입니다.");

chek.date.value="";

return;

}

if(chek.homp.value.match(/http\:\/\/[a-z0-9]+\.[0-9a-z]+(.[a-z]+)+\/[a-z0-9]+/g) !=chek.homp.value){

alert!("홈페이지는 http://x.x.x/xxx대충 이러한형태입니다.");

chek.homp.value="";

return;

}

if(chek.ch[0].checked==false){

for(var i=1;i<3;i++){

if(chek.ch[i].checked!=false){

return;

}

}

alert!("체크박스를 선택해주세요.");

return;

}

if(chek.ra[0].checked==false){

for(var i=1;i<3;i++){

if(chek.ch[i].checked!=false){

return;

}

}

alert!("라디오박스를 선택해주세요.");

return;

}

if(chek.idcard.value.match(/^[1234]+[0-9]*$/g)!=chek.idcard.value){

alert!("앞자리는 1,2,3,4만 들어갈 수 있습니다..");

chek.idcard.value="";

return;

}

if(chek.biznum.value.match(/[0-9]{3}\-[0-9]{2}\-[0-9]{5}/g)!=chek.biznum.value){

alert!("xxx-xx-xxxxx의 형태로 작성하셔야합니다.");

chek.biznum.value="";

return;

}

};


</script>


 </head>


 <body>

<div id="logForm">

  <form name="login" method="post">

<table>

<tr>

<td>ID</td>

<td><input type="text" name="id" value="" size="20" maxLength="14"style="ime-mode:disabled"></td>

<td>pwd</td>

<td><input type="password" name="pw" value=""></td>

</tr>

<tr>

<td>Email</td>

<td><input type="text" name="mail" value="" size="20"></td>

<td>숫자만</td>

<td><input type="text" name="num" value=""style="ime-mode:disabled"></td>

</tr>

<tr>

<td>전화번호</td>

<td><input type="text" name="phone" value="" size="15" maxLength="13"style="ime-mode:disabled"></td>

<td>휴대폰번호</td>

<td><input type="text" name="mphone" value=""style="ime-mode:disabled"></td>

</tr>

<tr>

<td>날짜</td>

<td><input type="text" name="date" value="" size="20" maxLength="10"></td>

<td>홈페이지</td>

<td><input type="text" name="homp" value=""></td>

</tr>

<tr>

<td>체크박스</td>

<td>

<input type="checkbox" name="ch" value="" size="20" maxLength="10">갑

<input type="checkbox" name="ch" value="" size="20" maxLength="10">을

<input type="checkbox" name="ch" value="" size="20" maxLength="10">병

</td>

<td>라디오박스</td>

<td>

<input type="radio" name="ra" value="">갑

<input type="radio" name="ra" value="">을

<input type="radio" name="ra" value="">병

</td>

</tr>

<tr>

<td>셀렉트박스</td>

<td>

<select >

<option selected>갑

<option>을

<option>병

</select>

</td>

<td>주민등록번호</td>

<td><input type="text" name="num1"size="8" value=""maxLength="6">-<input type="password" name="idcard" size="8"value=""maxLength="7"></td>

</tr>

<tr>

<td>사업자등록번호</td>

<td><input type="text" name="biznum" value="" size=""></td>

<td>일반</td>

<td><input type="text" name="" value=""></td>

</tr>

<tr>

<td></td>

<td><input type="button" name="botton" value="등록" size=""onclick="totalchek(document.login)"></td>

<td></td>

<td></td>

</tr>

</table>

</form>


</div>

 </body>

</html>