Categories

  • posts

Tags

  • JavaScript

정규표현식

  • 정규표현식의 사전적인 의미는 특정한 규칙을 가진 문자열의 집합을 표현하는데 사용하는 형식 언어이다.
  • 프로그램을 작성할 때 특성상 일정한 규칙을 가진 텍스트 문자열을 사용하는 경우가 많은데
    이럴때 정규 표현식을 사용하여 문자열에서 특정 내용을 찾거나 대체할 수 있다.
    특히 웹 프로그래밍은 문자열을 다루는 빈도가 특히 높기 때문에 사용하는게 거의 필수적이다.
  • 자바스크립트는 POSIX 정규표현식에서 확장된 Perl방식을 사용한다.
    이 외에도 수많은 정규표현식이 존재하지만 약간의 차이점을 제외하곤 거의 비슷하다.
  • 정규표현식을 실제로 사용할 때 언어마다 사용방법이 각각 다르다.
    자바스크립트의 경우 정규식 리터럴(‘/’ 로 감싸는 패턴) 이나 RegExp 생성자 함수를 이용하는 방법이 있다.
//정규식 리터럴 표현법
var re = /\w+\s/;      // <-- / / 로 패턴 구분자 시작과 종료, / / 안에 찾을 문자열의 패턴을 기입

// flag 를 설정시
var re = /\w+\s/g;    // <-- g : flag 설정

// RegExp 생성자 함수를 이용
var re = new RegExp("\\w+\\s");

// flag를 설정시
var re = new RegExp("\\w+\\s", "g");
- 간단한 정규표현식 사용 예제

// /\w+\s/ 패턴은 띄어쓰기 다음에 한개 이상의 문자를 찾는 정규식을 생성합니다. 
var word_space = /\w+\s/;

var temp = "i want cat ";

// match() 함수는 특정 텍스트 안에 검색할 단어, 찾고싶은 단어가 해당 문구에 포함되어있는지 확인한다.
// match() 함수로 정규표현식을 사용하여 특정 패턴을 검색하는 것이 가능하다.
console.log( temp.match(word_space) );  // <-- ["i "] 출력
  • 자주 사용하는 flag는 3가지 종류가 있으며, flag는 사용하지 않아도 된다.
    flag를 설정하지 않은 경우에는 문자열 내에서 검색대상이 많더라도 한번만 찾고 끝나게 된다.
g : Global - 문자열 내의 모든 패턴을 찾는다.

i : Ignore Case - 문자열의 대소문자를 구별하지 않는다.

m : Multi Line - 문자열이 행이 바뀌어도 찾는다.

위 예제에서 global flag를 사용할 경우

var word_space = /\w+\s/g;
console.log( temp.match(word_space) );   // <-- ["i ", "want ", "cat "] 출력
  • 이 외에도 공백을 무시하고 주석을 허용하는 x, 개생문자도 포함해서 찾는 s 등 다양한 flag가 있다.
  • 정규표현식에서 일정한 의미를 가지고 쓰는 특수문자를 메타 문자라고 부른다.
    여기에 쓰이는 글자가 포함된 패턴을 넣으려면 해당 글자 앞에 \를 넣어줘야 한다.
^  : 문자열의 시작

$  : 문자열의 종료. 옵션에 따라 문장의 끝 또는 문서의 끝에 매치된다.

.  : 임의의 한 문자

[] : 문자 클래스. 문자 클래스 안에 들어가 있는 문자는 그 바깥에서 하나의 문자로 취급된다.

|  : or를 나타냄

?  : 앞 문자가 없거나 하나 있음

+  : 앞 문자가 하나 이상임

*  : 앞 문자가 0개 이상임

{n,m}  : 앞 문자가 n개 이상 m개 이하. {0,1} 은 ?와 같은 의미다.

{n,}  : 앞 문자가 n개 이상. 위의 형태에서 m이 생략된 형태이다. {0,} 이면 *와 같고 {1,} 이면 +와 같은 의미이다.

()  : 하나의 패턴구분자 안에 서브 패턴을 지정해서 사용할 경우 괄호로 묶어주는 방식을 사용한다.
  • 정규표현식의 실제 적용 예제를 몇가지 보자. ( 정규표현식은 자주 쓰지 않으면 금방 잊게된다….)
//그 외 정규식표현의 사용 예제
var test_text = document.getElementById('test_text');

test_text.onkeyup = function(){

  console.log( '입력값 : ' + this.value );

  // 숫자만 사용 정규식
  var reg_number = /^\d+$/;
  // test() 함수는 regexp가 문자열에 일치하면 true를, 일치하지 않으면 false를 반환해준다.
  // test() 함수와 g flag는 같이 사용하면 안된다.
  console.log( reg_number.test( this.value ) );
  
  // 비밀번호 조합(영문, 숫자) 및 길이 체크 정규식
  var reg_password = /^(?=.*[a-zA-Z])(?=.*[0-9]).{4,10}$/;
  //console.log( reg_password.test( this.value ) );
  
  //jpg, gif, png 확장자를 가졌는지 확인
  var reg_image_file = /([^\s]+(?=\.(jpg|gif|png|bmp))\.\2)/;
  //console.log( reg_image_file.test( this.value ) );
  
  //이메일 양식 체크
  var reg_email = /^[a-z0-9_+.-]+@([a-z0-9-]+\.)+[a-z0-9]{2,4}$/;
  //console.log( reg_email.test( this.value ) );

}