[CS] 정규표현식에 대하여

Logun·2023년 10월 11일
0

CS

목록 보기
16/17
post-thumbnail

✅ 정규표현식


  • 패턴을 이용하여 문자 검색(Search), 문자 대체(Replace), 문자 추출(Extract)한다.
  • 성능은 느리지만, 보통 짧은 글에서 사용하고 편해서 성능이 큰 이슈가 되지 않는 경우에 많이 사용된다.
    정규표현식 테스트 하러 가기
  • 정규표현식을 사용하기 위해선 패턴을 찾는 것이 제일 중요하다.

사용법

/regexr/i
/ -> 시작, regexr -> 패턴, i -> 플래그

  • 휴대폰 번호찾기
    세 자리 숫자, 하이픈, 셋 혹은 네 자리 숫자, 하이픈, 네 자리 숫자 패턴으로 이루어져 있다.
    국제번호, 안심번호 등 예외 케이스는 제외
    • \d{3} 세 자리 아무 숫자
    • \d{3,4} 세, 네 자리 아무 숫자
  • 이메일 주소에서 중간 문자열만 뽑고 싶다면?
    문자열, @, 문자열, ., 문자열 패턴으로 이루어져 있다.
    • .+= 한 개 이상의 문자열
    • (...) 해당 영역만 그룹으로 뽑아낸다.
    • .+@(.+)\..+ 중간 문자열을 뽑아낸다.

Javascript에서의 사용법

  • 생성방법
    RegExp 객체로 정규표현식 기능을 제공한다.
    Array, Object처럼 Literal로 생성 가능하다.

    // 생성자 함수 방식
    // new RegExp(표현식)
    const regExp1 = new RegExp("^\d+");
    
    // new RegExp(표현식, 플래그)
    const regExp2 = new RegExp("^\d+","gi")
    
    // 리터럴 방식
    // /표현식/
    const regexp1 = /^\d+/;
    
    // /표현식/플래그
    const regexp2 = /^\d+/gi;
  • Test
    정규표현식 객체의 test 함수는 입력받은 문자열에 찾는 패턴이 있는지 찾은 후 있다면 true를 반환하고 없으면 false를 반환한다.

    적용

    const message = "안녕하세요. 010-3919-9225로 연락주세요";
    const message2 = "안녕하세요. 연락하지 마세요"
    
    // 정규표현식 리터럴
    const regExp = /\d{3}-\d{3,4}-\d{4}/;
    console.log(regExp.test(message)) // true
    console.log(regExp.test(message2)) // false
  • exec
    정규표현식 객체의 exec 함수는 입력받은 문자열에 찾는 패턴이 있는지 찾은 후 일치한 패턴 정보를 반환하고 없으면 null을 반환한다.

    적용

    const message = "안녕하세요. 010-3919-9225로 연락주세요";
    const message2 = "안녕하세요. 연락하지 마세요"
    
    // 정규표현식 리터럴
    const regExp = /\d{3}-\d{3,4}-\d{4}/;
    console.log(regExp.exec(message)) 
    console.log(regExp.exec(message2)) 

    반환 된 값

    [
    	'010-3919-9225'
        index: 7,
        input: '안녕하세요, 010-3919-9225로 연락주세요'
        group: undefined
    ]
    null
  • match
    String 객체의 match 함수는 정규표현식 객체를 파라미터로 받아 패턴이 있는지 찾은 후 일치한 패턴 정보를 반환하고 없으면 null을 반환한다. 정규표현식 객체의 exec 함수와 같다.

    적용

    const message = "안녕하세요. 010-3919-9225로 연락주세요";
    const message2 = "안녕하세요. 010-3919-9225말고 010-3919-9335로 연락주세요"
    
    // 정규표현식 리터럴
    const regExp = /\d{3}-\d{3,4}-\d{4}/;
    console.log(message.match(regExp));
    // 무조건 처음 매칭된 것을 반환한다.
    console.log(message2.match(regExp));
    // 모두 탐색하려면 matchAll을 사용할 수 있다.
    console.log([...message2.matchAll(/\d{3}-\d{3,4}-\d{4}/g)]) 

    반환 된 값

    [
    	'010-3919-9225'
        index: 7,
        input: '안녕하세요, 010-3919-9225로 연락주세요'
        group: undefined
    ]
    [
    	'010-3919-9225'
        index: 7,
        input: '안녕하세요, 010-3919-9225말고 010-3919-9335로 연락주세요'
        group: undefined
    ]
    [
      [
          '010-3919-9225'
          index: 7,
          input: '안녕하세요, 010-3919-9225말고 010-3919-9335로 연락주세요'
          group: undefined
      ]
      [
          '010-3919-9335'
          index: 23,
          input: '안녕하세요, 010-3919-9225말고 010-3919-9335로 연락주세요'
          group: undefined
      ]
    ]
    null
  • replace
    String 객체의 replace 함수는 정규표현식 객체를 파라미터로 받아 패턴이 있는지 확인 후 일치한 패턴 정보를 원하는 문자열로 바꿀 수 있다.

    적용

    const message = "안녕하세요. 010-3919-9225로 연락주세요";
    const message2 = "안녕하세요. 010-3919-9225말고 010-3919-9335로 연락주세요"
    
    // 정규표현식 리터럴
    const regExp = /\d{3}-\d{3,4}-\d{4}/;
    console.log(message.replace(regExp, "전화번호"));
    console.log(message2.replace(regExp, "전화번호"));
    console.log(message2.replace(/\d{3}-\d{3,4}-\d{4}/g, "전화번호")) 

    반환 된 값

    안녕하세요. 전화번호로 연락주세요
    안녕하세요. 전화번호말고 010-3919-9335로 연락주세요
    안녕하세요. 전화번호말고 전화번호로 연락주세요
  • search
    정규표현식 객체를 파라미터로 받아 패턴이 있는지 찾은 후 일치한 패턴 정보의 위치를 반환한다.

    적용

    const message = "안녕하세요. 010-3919-9225로 연락주세요";
    const message2 = "안녕하세요. 010-3919-9225말고 010-3919-9335로 연락주세요"
    
    // 정규표현식 리터럴
    const regExp = /\d{3}-\d{3,4}-\d{4}/;
    console.log(message.search(regExp));
    console.log(message2.search(regExp));
    // 무조건 처음 매칭된 것을 반환한다.
    console.log(message2.search(/\d{3}-\d{3,4}-\d{4}/g));
    // 모두 탐색하려면 matchAll을 사용할 수 있다.
    console.log([...message2.matchAll(/\d{3}-\d{3,4}-\d{4}/g)]) 

    반환 된 값

    7
    7
    7
    [
      [
          '010-3919-9225'
          index: 7,
          input: '안녕하세요, 010-3919-9225말고 010-3919-9335로 연락주세요'
          group: undefined
      ]
      [
          '010-3919-9335'
          index: 23,
          input: '안녕하세요, 010-3919-9225말고 010-3919-9335로 연락주세요'
          group: undefined
      ]
    ]
    null
  • capture
    캡처가 적용된 정규표현식을 이용하면 match 반환값의 1번 인덱스부터 순차적으로 캡처 결과가 들어간다.

    적용

    const message = "안녕하세요. 010-3919-9225로 연락주세요";
    
    // 정규표현식 리터럴
    const regExp = /(\d{3})-(\d{3,4})-(\d{4})/;
    console.log(regExp.match(regExp));

    반환 된 값

    [
    "010-3919-9225",
    "010",
    "3919",
    "9115",
    index: 7,
    input: "안녕하세요. 010-3919-9225로 연락주세요",
    groups: undefined
    ]

Run-length encoding

  • 매우 간단한 비손실 압축 방법
    AAAAAABBBDFFFFFFFKK의 압축

    "6A3B1D7F2K"로 압축 될 수 있다.
    6개의 A, 3개의 B, 1개의 D, 7개의 F, 2개의 K

코드로 확인하기

적용

const raw = "AAAAAABBBDFFFFFFFKK";
const compressed = "6A3B1D7F2K"

const regExp = /(.)\1*/g;
const result = raw
	.match(regExp)
	.reduce((a, b) => a + `${b.length}${b.slice(0, 1)}`, "");

console.log(result);
console.log(result === compressed);

반환 된 값

6A3B1D7F2K
true
profile
로건의 개발이야기

0개의 댓글