http://thefarmersfront.github.io/blog/reg-exp-01/

정규식(Regular Expression)과 슬랙 채널 공유로 주문서 이름에 특수 문자 입력을 막은 에피소드

태초에 미션이 있었다

주문자 이름에 특수 문자가 입력이 되지 않게 하라!

위와 같은 특명이 티켓과 함께 나에게 주어졌다. 주문자 이름에 특수 문자가 들어가면 백엔드 시스템에서 오류가 나고 있었던 상황이었다.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/ce5c21f6-184a-448e-8650-2546f2bf4a4f/ksy_think.png

까칠한 규식이 형

여기서 잠깐 개발자들이 좀처럼 꺼려하는 까칠한 우리 규식이 형을 잠시 소개하고 시작하는게 좋겠다.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/c6eabf28-314b-4c42-b9fe-4d7c4ad0237a/reg_exp.png

규식이 형 말투

규식이 형 말투는 주로 /정규 표현식/[플래그] 와 같이 이루어져 있다. 예) /\\w\\d/gi; 여기서 \\w\\d가 '정규표현식'이고 gi가 '플래그'다.

아래 기본 표현식과 플래그 정도만 알아도 웬만한 형의 말투는 대부분 이해할 수 있을 것이다.

제목 없는 데이터베이스

표현식 설명
x y
예) /green red/는 "green apple"에서 "green"과 매치, "red apple"에서 "red"와 매치
[x] []안의 한 문자와 일치예) [abc] a b c 중 한 문자와 일치
(x) ()안의 문자들을 메모리에 할당,예) (bo)y boy중 bo는 $1로 치환할 수 있음
(?:x) ()안의 문자들을 메모리에 할당 하지 않음,예) (?:boy
^ 라인의 시작 지점과 매치주의) [^0-9] []안의 ^는 Not을 의미함(예제는 숫자가 아닌 모든 문자)
$ 라인의 끝 지점과 매치
[a-z] 알파벳 소문자와 매치, [A-Z]는 대문자와 매치
\d (digit) 숫자와 매치, [0-9]와 동일
\w (word) 알파벳 대소문자, 숫자 및 (언더바)와 매치, [A-Za-z0-9] 와 동일
\s 스페이스, 탭, 줄바꿈 문자(White space character) 문자와 매치예) /\s\w*/는 "foo bar"에서 " bar"와 매치
\r 개행 문자(Carriage return)
\n 개행 문자(Line feed)
. 개행 문자(\n, \r, \u2028 or \u2029)를 제외한 임의의 모든 문자와 매치
x? x를 포함하거나 포함하지 않아도 매치(1번 또는 0번)
x+ 반드시 하나 이상 x를 포함하는 문자와 매치예)"boo bii foo".replace(/(bo+)/g, "($1)");는 "(boo) bii foo"를 출력
x* x를 포함하거나 포함하지 않아도 모두 매치예)"boo bii foo".replace(/(bo*)/g, "($1)");는 "(boo) (b)ii foo"를 출력

\대문자는 \소문자의 반대를 뜻한다. 예를 들어 \D는 [^\d], 즉 [^0-9]와 같은 의미이며 숫자를 제외한 모든 문자와 매치 된다. \S는 [^\s]와 같으며 스페이스, 탭, 줄바꿈 문자를 제외한 모든 문자와 매치 된다.

몇가지 실제 예제

각 예제 코드는 브라우저 콘솔 창에서 테스트 가능하다.