📚 What is TIL?

정규표현식

Regular Expression

문자열에서 특정 내용을 찾거나 대체 또는 발췌하는데 사용된다

정규표현식 연습 사이트


정규식 구성

/pattern/i 식의 슬래쉬 문자 두개 사이로 정규식 기호가 들어가는 형태이다

const regex = /abc/ // 리터럴 방식
const regex = new RegExp("abc") // 생성자 방식  
const regex = new RegExp(abc/) // 생성자 방식  

🔎 RegExp 는 정규식을 나타내는 객체로 문자열 검색, 치환, 부분리 등의 작업에 사용된다
new RegExp(패턴으로 사용할 문자열, 플래그) 처럼 주로 생성자 함수를 이용해서 생성하고,
 new 연산자를 사용하지 않고 리터럴 형태로 정규식을 사용할 수도 있다

🔎 메서드에서만 사용되는 것이 아니라 정규표현식이 들어가는 곳 모두에서 사용할 수 있다


정규식 메서드

메서드 의미
(“문자열”).match(/정규표현식/플래그) “문자열”에서 “정규표현식”에 매칭되는 항목들을 배열로 반환
(“문자열”).replace(/정규표현식/, “대체문자열”) “정규표현식”에 매칭되는 항목을 “대체문자열”로 변환
(“문자열”).split(정규표현식) “문자열”을 “정규표현식”에 매칭되는 항목으로 쪼개어 배열로 반환
'paullab CEO leehojun hello CEO'.replace(/CEO/g, 'CTO')
// flag로 global을 주어서 전체 변경(m-다중라인, i-대소문자구분X)
'paullab CEO leehojun hello CEO'.match(/CEO/g)
// ['CEO', 'CEO']
'paullab CEO leehojun hello CEO'.split(/CEO/g)
// ['paullab ', ' leehojun hello ', '']


정규식 기호 사용 예시

("hello hallo hello").match(/.(a|e|o)ll./g)
("hello hallo hello hello hi").match(/.(a|e|o)ll./g)
("hello hallo hello hello hi").match(/.[eao]ll./g)
// [ 'hello', 'hallo', 'hello' ]
// [ 'hello', 'hallo', 'hello', 'hello' ]
// [ 'hello', 'hallo', 'hello', 'hello' ]
더보기
/ hello / g
 일반문자열

/^ hello / g
/ hello$ / g
/^ hello$ / g
 처음과 끝

/ hello / g
/ h.llo / g
/ hello..world / g
 모든문자 매핑(.)

h[eao]llo / g
 모든문자 매핑

h[a - zA - Z0 - 9]llo / g
 범위

h[^ ae]llo / g
 부정

 

그루핑 규칙


(on | ues | rida) / gm //
 그룹 1로 3개 중 매칭되는 패턴 찾음

/(on|ues)|(rida)/gm
 그룹1(on|ues)과 그룹2(rida)로 각각 매칭되는 패턴 찾음

/hello (?!world)/gm
 hello 뒤에 world가 오지 않는 것 (네거티브 매칭)

/hello (?=world)/gm
 hello 뒤에 world가 오는 것 (파지티브 매칭)


전화번호 형식

[0-9]{3}[-.* ][0-9]{4}[-.* ][0-9]{4}/gm
/[0-9]{2,3}[-.* ]?[0-9]{3,5}[-.* ]?[0-9]{4}/gm
/[0-9a-zA-Z]+@[0-9a-zA-Z]+.[a-zA-Z]+/gm


이메일주소 형식

const email = 'dongsup@gmail.com';
const regexr = /^[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*\.[a-zA-Z]{2,3}$/;


플래그 사용

'!!!'.split('!') // ['', '', '', '']
'!a!a!a'.split('!') // ['', 'a', 'a', 'a']
'a!a!a!'.split('!') // ['a', 'a', 'a', '']
'!a!a!a'.split('!').length -1 // 3
'a!a!a'.split(/!/g); // [ 'a', 'a', 'a' ]

🔎 split(‘!’) 은 문자열을 구분자로 사용하여 문자열을 분리하지만,
🔎 구분자 ‘!’ 문자열을 하나의 단어로 인식하기 위해서는 ‘g’ 플래그를 사용한다
🔎 split(/!/g) 는 정규식 패턴을 사용해서 문자열을 구분자로 인식하지 않고 문자열을 분리한다


그룹 추출

'gogaooogogooo'.match(/(go)/g); // ['go', 'go', 'go']
'gogaooogogooo'.match(/[go]/g);
"87a99b00fww89e".match(/[0-9]{2}[a-zA-Z]/g)
"87a99b00fww89e".match(/([0-9]{2})([a-zA-Z])/g) // 숫자 그룹과 문자 그룹으로 나눈다
"87a99b00fww89e".match(/(\d{2})([a-zA-Z])/g)
// [ '87a', '99b', '00f', '89e' ]


replace 응용

const string = `hojun, lee
gildong, hong
hojung, choi
junho, lee`

let result1 = string.replace(/(\w+), (\w+)/gm, "$2 $1");
console.log(result1);
let result2 = string.replace(/(\w+), (\w+)/gm, "$2_$1");
console.log(result2);
let result3 = string.replace(/(\w+), (\w+)/gm, "$1님 안녕하세요.");
console.log(result3);
let result4 = string.replace(/(\w+), (\w+)/gm, "$2 $1!!$1!!$1");
console.log(result4);



정규표현식 문제 결과 예측해보기


?

my_string letter result
“abcdef” “f”
“BCBdbe” “B”
function solution(my_string, letter) {
  return my_string.split(letter).join('');
}

function solution(my_string, letter) {
  let reg = new RegExp(letter, 'g') 
  return my_string.replace(reg, '');
}



?

my_string result
“aAb1B2cC34oOp”
“1a2b3c4d123”
function solution(my_string) {
  return my_string
    .match(/[0-9]/g)
    .reduce((a, b) => parseInt(a) + parseInt(b), 0)
}

function solution(my_string) {
  return my_string
    .replace(/[^0-9]/g, '')
    .split('')
    .reduce((a,b) => parseInt(a) + parseInt(b),0)
}



?

order result
3
29423
function solution(order) {
  return String(order).replace(/[^369]/g,'').length
}

function solution(order) {
  return (order.toString().match(/[369]/g) ?? []).length;
}



?

my_str n result
“abc1Addfggg4556b” 6
“abcdef123” 3
function solution(my_str, n) {
  let reg = new RegExp(`\\w{1,${n}}`, 'g') // '\'를 표현하기 위해서 '\\'를 사용
  return my_str.match(reg)
}



?

order result
“aAb1B2cC34oOp”
“1a2b3c4d123Z”
function solution(order) {
  return String(order).replace(/[^369]/g,'').length
}

function solution(order) {
  return (order.toString().match(/[369]/g) ?? []).length;
}



?

data result
‘a10b9r1ce33uab8wc918v2cv11v9’
function solution(data){
  let result = data.match(/([rev])(10|[0-9])/g).reduce((a, c) => a + parseInt(c.slice(1)), 0).toString()
  return `${result[0]}월 ${result[1]}일`
}


Reference

태그:

카테고리:

업데이트:

댓글남기기