IP parsing(+C), URL parsing 정규식 pattern
직접 짜기 전에 org.springframework.web.util.UriComponentsBuilder 참조.
IP, HOST, HTTP 등 패턴이 static 변수로 선언되어 있음.
또는 InetAddressValidator 같이 아예 유틸리티 클래스로 제공되고 있을 수 있다.
비슷한 계열이 몇 개씩 된다.
```java
InetAddresses.isInetAddress() -- guava 530ms
InetAddressUtils.isIPv4Address() -- httpclient 1146ms
InetAddressValidator.getInstance().isValid() -- apache.commons 1573ms
InetAddress.getByName() -- java.net 인데...
ㄴ domain name을 넣으면 DNS 호출하도록 동작하게 되어 있음.
ㄴ IP string을 넣으면 DNS 호출 까지는 안하고 패턴 체크만 한다.
ㄴ malformed string이 들어오면 DNS까지 다녀오므로 비추.
* 시간은 1000만번 반복 기준
```
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+))?(?:\/([^?#]*))?(?:\?([^#]*))?(?:#(.*))?$/;
```
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);
}
```
'Coding Note' 카테고리의 다른 글
상속, 인터페이스, 트레이트 차이점과 어떨 때 사용하나. (0) | 2017.06.30 |
---|---|
Encoding 정리. Unicode, ANSI, UTF, CP949 (2) | 2017.06.05 |
서버 취약점 점검 체크리스트 (0) | 2017.01.27 |
call-by-reference, call-by-value + call-by-address (0) | 2016.11.22 |
객체 지향 5대 원칙 : SOLID (0) | 2016.09.13 |