개발정리

javascript / Chapter7. 정규 표현식 본문

JS/javascript

javascript / Chapter7. 정규 표현식

성구님 2017. 2. 26. 23:07
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

00 들어가며

01 예제

02 정규표현식 객체 생성

03 구성요소

 

00 들어가며

  • 자바스크립트 정규표현식은 perl에서 채용
  • 메소드 종류
    • regexp.exec
    • regexp.test
    • string.match
    • string.replace
    • string.search
    • string.split 
    • 등등
  • 자바스크립트의 정규 표현식은 약간의 재해석과 perl의 확장 구문을 제외하고는
    벨 연구소에서 비롯된 원래의 체계를 따른다.

 

 

01 예제

  • URL 매칭 정규 표현식

    var parse_url = /^(?:([A-Za-z]+):)?(\/{0, 3})([0-9.\-A-Za-z]+)(?::(\d+))?(?:\/([^?#]*))?(?:\?([^#]*))?(?:#(.*))?$/;
    • 각 그룹별 해석
      • /^(?:([A-Za-z]+):)?/
        • ^ 는 문자열의 시작
        • 뒷 ?는 옵션, 없어도 된다.
        • 알파벳 1개 이상이고 마지막이 :로 끝나는 문자열
        • 프로토콜 매칭 정규식
      • (\/{0, 3})
        • /문자와 0번이상 3번이하 일치
      • ([0-9.\-A-Za-z]+)
        • 하나 이상의 숫자, '.', '-' 문자와 일치
      • (?::(\d+))?
        • \d는 숫자 문자
        • :로 시작하는 숫자 1개 이상
        • 옵션 속성
        • 포트번호 매치
      • (?:\/([^?#]*))?
        • ?나 #을 제외한 0개이상의 문자
        • 여러 제약조건이 부족한 어설픈 정규표현식이다.
      • (?:\?([^#]*))?
        • ?로 시작하는 #을 제외한 문자 0번 이상
      • (?:#(.*))?$
        • #으로 시작하는 마지막 옵션 그룹.
        • $는 문자열의 끝을 의미
          • 더 이상 URL은 없다는 뜻.
  • 정규표현식은 짧고 간단할 때 최상이다.
  • 다음은 숫자에 매칭되는 정규표현식

    var parse_number = /^-?\d+(?:\.\d*)?(?:e[+\-]?\d+)?$/i;
    • ^-?
      • 음수로 시작할 수 있다는 옵션
    • \d+
      • 숫자로 시작하는가?
    • (?:\.\d*)?
      • 비캡쳐 그룹
      • 소수점과 그 뒤에 오는 0개 이상 숫자.
    • (?:e[+\-]?\d+)?$
      • 옵션 비캡쳐 그룹
      • e와 +, -선택, 그리고 숫자 하나 이상
    • i
      • i플래그는 대소문자를 구분하지 않겠다는 의미

 

 

02 정규표현식 객체 생성

  • 두 가지 방법
    • 리터럴 사용
      • /.../
    • RegExp생성자 사용
  • 리터럴 플래그
    • g(global) : 여러번 일치함, 정확한 의미는 메소드에 따라 다르다.
    • i(insensitive) : 대소문자를 구분하지 않음
    • m(multiline) : ^와 $가 라인 끝 문자에 일치 할 수있음
  • RegExp
    • 역슬래시가 리터럴과는 조금 다르다.
      • 두 번씩 사용해야 함
    • 플래그
      • g플래그 사용시 true
      • i플래그 사용시 true
      • m플래그 사용시 true
      • lastIndex : 다음 exec실행을 위한 시점. 초기값은 0
      • source : 정규표현식 소스 텍스트
    • 런타임시 알 수있는 자료를 가지고 정규표현식을 생성할 때 유용하다.
  • 정규표현식 리터럴로 만들어진 RegExp객체는 다음과 같이 하나의 인스턴스를 공유한다.

    function make_a_matcher () {
        return /a/gi;
    }
    var x = make_a_matcher();
    var y = make_a_matcher();
      
    x.lastIndex = 10;
    console.log(y.lastIndex); // 10

 

 

03 구성요소

  • 정규 표현식의 선택에는 하나 이상의 정규표현식 시퀀스가 포함된다.
  • 각 시퀀스는 | 로 구분

    "into".match(/in|int/);
  • 시퀀스
    • 하나 이상의 정규표현식 요소를 포함
    • 수량자가 없다면 한 번만 일치
  • 정규표현식 요소
    • 문자, 괄호그룹, 문자 클래스, 이스케이프 시퀀스 등
    • \ / [] () {} ? + * | . ^ $
    • ^ : 문자의 시작
    • & : 문자 끝
    • . : 모든 문자
  • 이스케이프
    • 역슬래시는 정규표현식 요소와 문자열에서 모든게 이스케이프 됐다는 것을 의미
    • 정규 표현식에서 다른 점
      • \f 폼피드
      • \n LF
      • \r CR
      • \t Tab
      • \u 유니코드
      • \b 는 역스페이스 문자가 아니다.
      • \d 아라비아 숫자
        • \D는 아라비아 숫자를 제외한 문자
      • \s는 공백문자들 [\f\n\r\t\u000B\u0020\u00A0\u2028\u2029]
        • \S는 \s의 반대
      • \w는 [0-9A-Za-z]
        • \W는 \w반대
    • 간단히 문자만을 선택하고 싶을 때 사용하는 클래스
      • [A-Za-z\u00C0-\u1FFF\u2800-\uFFFD]
    • 자바스크립트 정규표현식은 국제화에 지원에 상당히 빈약하다.
    • \b는 단어의 경계를 나타내지만 \w에 해당하는 규칙이 사용되기 때문에 다중 언어 어플리케이션에선 무용지물이다.
    • \1은 첫 번째 그룹에 캡쳐된 텍스트에 대한 참조
      • 중복된 단어를 찾고자 하는 경우

        var doubled_words = /([A-Za-z\u00c0-\u1FFF-\uFFD'\-]+)\s+\|/gi;
  • 그룹
    • 종류
      • 캡쳐
      • 비캡쳐
      • 긍정형 룩어헤드
      • 부정형 룩어헤드
    • 캡쳐
      • 괄호로 묶인 정규 표현식 선택
      • 일치하는 문자들은 캡쳐된다.
      • 캡쳐 그룹에는 번호가 주어짐.
    • 비캡쳐
      • (?: 접두어로 시작
      • 일치하는지 확인만 한다.
    • 긍정형 룩어헤드
      • (?= 접두어로 시작
      • 일치되는 부분을 찾은 뒤 텍스트를 그룹이 시작하는 지점으로 돌린다.
      • 좋지 않음
    • 부정형 룩어헤드
      • (?! 접두어로 시작
      • 긍정형과 반대로 동작
      • 역시 좋지않다.
  • 클래스
    • 특정 문자 집합 하나를 지정하는데 편리
    • (?:a|e|i|o|u) === [aeiou]
    • 문자의 범위를 지정할 수 있다.
      • 특수문자
        • [!-\/:-@\[-`{-]
        • ! ~ / 까지
        • : ~ @ 까지
        • [ ~ `까지
        • { 이후 모든 문자
    • 부정형 클래스
      • ^를 붙이면 부정형
  • 클래스 내의 이스케이프
    • [/b]는 단어 경계가 아닌 역스페이스 문자
    • 문자클래스에서 이스케이프되어야 하는 특수문자
    • /  [  \  ]  ^
  • 수량자
    • 몇 번 일치해야 하는지 결정하는 수량자
    • /www/ === /w{3}/

    • {3,6}은 3번에서 6번 일치
      {3,} 은 3번 이상
      ?는 {0, 1}
    • *은 {0,} 0번 이상
    • +는 {1,} 1번 이상
    • 일반적으로 ?를 붙이지 않는 정규 표현식이 좋다.

 

 

참고문헌

1. 더글라스 크락포드, 김명신  자바스크립트 핵심가이드 javascript The good parts』, 한빛미디어

'JS > javascript' 카테고리의 다른 글

Chapter9, 부록  (0) 2017.04.09
Chapter8 메소드  (0) 2017.04.09
javascript / Chapter6. 배열  (0) 2017.02.26
javascript / Chapter5. 상속  (0) 2017.02.26
javascript / Chapter4. 함수 2  (0) 2017.02.08
Comments