엄범



Regex는 느리다? 그렇지 않다.

compile은 오래걸리지만, evaluation할 때는 그냥 문자열 찾는 것 만큼 빠르게 잘 동작함.

그래서 굳이 regex를 피할 필요는 없다. 그냥 적재 적소에 사용하면 된다.


URL parsing

```js

regexp [url, scheme, slash, host, port, path, query, hash]

var parse_url = /^(?:([A-Za-z]+):)?(\/{0,3})([0-9.\-A-Za-z]+)(?::(\d+))?(?:\/([^?#]*))?(?:\?([^#]*))?(?:#(.*))?$/;

```


*** URL encoding

이건 번외의 얘기이긴 하지만

query parameter의 value에 =이나 /나 +가 포함되어 있어도.. /?{}={}&{}={}... 형식이라는게 있으니 /나 =가 바로 특문으로 인식되지는 않는데... url에 의미없는 /나 =가 끼어 있는게 좋은 url은 아니므로 encoding하는 것이 좋다.

일례로 query-string같은 npm 라이브러리에서 파싱할 때 +가 끼어있으면 이걸 공백으로 바꿔버리는 등 예상치 못한 문제가 발생할 수 있음.

query param 형태로 요청하거나 받을 때(GET)에는 URL encoding을 신경써주어야 한다. body로 가는 POST 등은 괜찮지만.



IP parsing

```python

^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$

```



C에서 IP valid check

```c

bool isValidIpAddress(char *ipAddress)

{

    struct sockaddr_in sa;

    int result = inet_pton(AF_INET, ipAddress, &(sa.sin_addr));

    return result != 0;

}

```


근데 보통은 검사 안해줘도 connect에서 perror로 오류내용 출력할 수 있다.

```c

if (connect(sock, (struct sockaddr *)&sin, sizeof(sin))) {

    perror("connect");

    exit(1);

}

```