정규표현식

정규 표현식이 뭔지는 대충 다 알 것이다. 문자열을 파싱하는 경우라던지, 규칙을 검사하는 경우 등 유용하게 쓰일 수 있다. 그런데 위와 같은 작업을 해야하는 경우. 선택의 기로에 선다. 정규식 표현법을 쓸 것인가.. 그냥 문자열을 가지고 if문 떡칠을 할 것인가.. 난 후자가 편했던거 같다. 오늘 블로그를 작성하면서 전자도 편해지도록.. 기대한다.

그냥 정규식 표현 규칙이나 함수들은 https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/%EC%A0%95%EA%B7%9C%EC%8B%9D 여기서 보면 된다.

그럼 난 여기 무었을 쓸거냐? 그냥 몇 예시를 보며 정규식을 이해 해 보겠다.

url 파싱

url의 구조를 간략히 보면

protocol://user:password@host:port/path1/path2/. . . ?query=string

https://soob:soob123@naver.com:80/first/last?query=search=soob 이런 식인데, url 구조에서 반드시 필요한 부분도 있고, 없어도 되는 부분도 있다.

위와 같은 구조로 문자열을 파싱하기 위해서,

  1. 정규식 표현 함수 중에서도 match함수와 /gm 옵션으로 그룹 매칭을 시켜주면 효율적으로 파싱 할 수 있다.
  2. 그룹핑을 위해 ()로 묶어준다.

그래서 그냥 그루핑을 어떻게 하면 될지 문자열에 표시 해 보겠다.

url_regex = (http)((user)(:password))(host)(:port)(paths)(?query=string)

이것을 정규식으로 표현하면 된다.

  • http : 문자 여러개 -> [a-zA-z]* , *을 뒤에 쓰면 0회 이상 반복
  • user : 문자, 숫자 다 가능 특수문자 가능 -> [\w$-_.+!*']*
  • password : user와 같다 -> [\w$-_.+!*']*
  • host : [a-zA-.]+ ,+을 뒤에 쓰면 1회 이상 반복. 즉 1번은 무조건 나와야 한다.
  • port : :[0-9]*
  • paths : \/?[\w$-_.+!#*'()\,\;\/:\@]* ?를 뒤에 쓰면 앞의 내용이 1번 혹은 0번 나올 수 있다. 즉 있거나 없거나 둘 가 가능. 여기에서는 /가 나올수도 있고 안나올 수도 있고
  • ?query=string : \?[\w$-_.+!*'()\,\;\/:\@\&=]*

그래서 그룹별로 나누어서 합쳐 보면 url_regex = ([\w]):\/\/(([\w$-_.+!*'])?(:[\w$-_.+!*'()\,])?\@)?([\w-.]+)(:[0-9])?(\/?[\w$-_.+!#*'()\,\;\/:\@])(\?[\w$-_.+!*'()\,\;\/:\@\&=])?

url 요소에서 있을수도 있고 없을수도 있는것 뒤에는 ?를 사용했다.

const urlComponents = url_regex.exec(url_string)

urlComponets에는 ()로 그루핑된 배열이 들어가고, 없는 것들은 undefined가 들어간다.