JavaScript - Regex(Regular Expression)

운명애·2021년 1월 10일
0

JS

목록 보기
2/4

freeCodeCamp 의 tutorial 을 요약했습니다.

다른 언어에서뿐만이 아니라 JavaScript(JS) 에서도 Regular expression(regex) 는 string 탐색을 위한 special string 이다.

text 를 찾고, 탐색하고, 다른 text 로 변경할 때 regex 를 이용하면 쉽게 작업을 수행할 수 있다. 처음 코딩을 배우기 시작하고 다른 코드를 참고할 때 종종 암호같이 보이는 표현들을 마주하고 당황하곤 했는데, 나중에 알고보니 regex 였다.

이 기회에 JS에서 사용되는 regex 를 정리해보고자 한다. (제발 다른 언어들의 regex 도 비슷하게 생겼기를 바라면서... -> 다행히 비슷하다)

1)
가장 기초적인 형태부터 보자.
/text/ text 부분에 찾고자 하는 단어를 입력한다. string 타입이지만 '' 또는 "" 를 사용하지 않는 것에 주의!

const stringExample = 'I am Sam!';
const regex = /Sam/;

stringExample.method(regex); // output will be ['Sam']
regex.test(stringExample); // output will be true

regex 를 test 하는 방법으로 'method()' 와 'test()' method를 사용할 수 있다. 각각 적용되는 대상이 다른 것에 주의하자. method() 는 찾고자 하는 단어를 포함하는 array 를 test() 는 boolean 값을 산출한다.

uppercase(대문자)와 lowercase(소문자)를 구별해야한다. 즉, /sam/ 은 stringExample 에서 'Sam' 을 찾아내지 못한다.

대문자, 소문자 관계없이 해당 단어를 찾아내는 표현식이 있다.

const stringExample = 'I am Sam!';
const regex = /sam/i;

stringExample.method(regex) // output will be ['Sam'];
regex.test(stringExample) // output will be true;

regex 의 마지막 / 바로 후에 i 를 붙이면 된다(/sam/i). i 는 ignore case의 i 로 생각하자. i 와 같은 표현을 flag 라고 부른다.

/Sam/ 이나 /sam/i 는 string 에서 처음 등장하는 해당 text 만 찾아낸다. 만약, 해당 text 가 반복해서 string 에 등장한다면 처음에 등장하는 text 만 찾아진다. 해당 text 를 string 에서 모두 찾아내는 flag가 존재하는데, 바로 g (global의 g)이다.

const stringExample = 'I am Sam, Sam, Sam!';
const regex1 = /sam/i;
const regex2 = /sam/ig;

stringExample.method(regex1); // output will be ['Sam']
stringExample.method(regex2); // output will be ['Sam', 'Sam', 'Sam']

이 섹션에서 마지막으로 살펴볼 표현은 /./이다. /Sam/과 같은 표현은 'Sam'만 찾아낼 수 있다. 그러나 코딩을 하다보면 정확한 spell 을 모르거나 string 에서 spell 이 잘못 입력된 text 를 찾아야 하는 경우가 있다. /character./ 의 형태로 입력하면 해당 character가 들어간 모든 text 를 다음 character 와 함께 찾아주기 때문에 사용하면 유용하다.

let humStr = "I'll hum a song";
let hugStr = "Bear hug";
let regex = /hu./;

regex.test(humStr); // Returns true
regex.test(hugStr); // Returns true

2)
이제 조금 더 구체적으로 text 를 찾는 표현을 알아보자. /Sam/ 이나 /hu./ 와 같은 표현들은 하나만 찾거나 모두 찾는다는 점에서 극단적이다. 여기에서 완화하여 특정 문자가 들어간 단어를 찾을 수 있는 표현식이 있다. 예를 들어서, /c[ak]e/를 regex 로 설정하면 c 와 e 사이에 a 또는 k가 들어간 모든 단어를 찾을 수 있다.

let bigStr = "big";
let bagStr = "bag";
let bugStr = "bug";
let bogStr = "bog";
let bgRegex = /b[aiu]g/;

bigStr.match(bgRegex); // Returns ["big"]
bagStr.match(bgRegex); // Returns ["bag"]
bugStr.match(bgRegex); // Returns ["bug"]
bogStr.match(bgRegex); // Returns null

/[aeiou]/ig 이렇게 활용하면 string에서 모든 모음을 찾아낼 수 있다.

string 에 쓰인 모든 알파벳을 찾고싶을 때 /[abcde...xyz]/처럼 모든 알파벳을 입력 해야할까?
이럴 때를 위해서 -이 존재한다. /[a-z]/ 쓰면 위와 같은 표현이 된다. 숫자에도 마찬가지로 적용되는데 string 에 사용된 모든 알파벳과 모든 숫자를 찾고 싶으면 다음과 같은 표현식을 사용하면 된다.

let string = 'fAdJSKfjsklfasklZxdf213907095141123';
let regex = /[a-z0-9]/ig;

string.match(regex);

/[^aeiou]/ - aeiou 로 시작하지 않는 문자열
/a+/ - a 와 같은 하나 이상의 문자열
/a*/ - a 와 같은 0 개 이상의 문자열
/^a/ - a 로 시작하는 문자열
/a$/ - a 로 끝나는 문자열
/\w/ = /[A-Za-z0-9_]/
/\W/ = opposite of /\w/
/\d/ = /[0-9]/
/\D/ = /[^0-9]/
/\s/ - whitespace; =/[ \r\t\f\n\v]/

다음은 간단한 문제: 다음의 조건을 찾아내는 regex 를 작성하라.

1) 사용자 이름은 오직 알파벳과 숫자로 이루어진 문자열이다.

2) 사용자 이름에서 숫자는 반드시 마지막에만 등장한다.

3) 소문자와 대문자 모두 사용 가능하다.

4) 사용자 이름은 반드시 두 글자 이상이어야 한다. 두 글자인 사용자 이름은 반드시 알파벳으로만 구성되어야 한다.

const regex = /^[a-z][a-z]+\d*$|^[a-z]\d\d+$/i; //or
const regex2 = /^[a-z]([0-9]{2,}|[a-z]+\d*)$/i;
profile
개발자 하고 싶어요..

0개의 댓글