정규표현식 전방탐색과 후방탐색
정규표현식을 사용하여 문자열을 검색할 때, 특정 문자열의 위치 조건을 더해 정밀한 탐색이 가능하다.
흔히 쓰는 pcre 정규식과 vim 에서 쓰는 방식이 약간 다르다.
예제 apache 로그
0.0.0.0 - - [03/Jun/2019:03:05:45 +0900] "POST /xmlrpc.php HTTP/1.1" 200 418
0.0.0.0 - - [03/Jun/2019:03:51:56 +0900] "GET / HTTP/1.0" 400 362
0.0.0.0 - - [03/Jun/2019:03:52:07 +0900] "GET /issView?iId=162604 HTTP/1.1" 302 341
0.0.0.0 - - [03/Jun/2019:03:52:24 +0900] "GET / HTTP/1.0" 400 362
0.0.0.0 - - [03/Jun/2019:04:12:21 +0900] "POST /xmlrpc.php HTTP/1.1" 200 418
0.0.0.0 - - [03/Jun/2019:04:12:21 +0900] "POST /wp-cron.php?doing_wp_cron=1559502741.5204310417175292968750 HTTP/1.1" 200 -
0.0.0.0 - - [03/Jun/2019:04:56:18 +0900] "GET /lunchwheel HTTP/1.1" 200 12272
0.0.0.0 - - [03/Jun/2019:09:52:10 +0900] "GET /static/img/dropdown.png HTTP/1.1" 404 233
0.0.0.0 - - [04/Jun/2019:11:02:14 +0900] "GET /search HTTP/1.1" 301 253
0.0.0.0 - - [03/Jun/2019:21:52:07 +0900] "GET /search/login HTTP/1.1" 200 6323
0.0.0.0 - - [04/Jun/2019:11:02:14 +0900] "GET /search/ HTTP/1.1" 301 253
0.0.0.0 - - [03/Jun/2019:21:52:14 +0900] "GET /search/?s=keyword&sort=accuracy HTTP/1.1" 200 43888
0.0.0.0 - - [05/Jun/2019:17:47:24 +0900] "GET /issView?iId=93989 HTTP/1.1" 302 339
후방탐색 ?<=
- pcre
- (?<=pattern1)pattern2
- vim
- (pattern1)\@<=pattern2
위 예제 apache 로그에서 GET 메소드가 요청된 경로를 찾고자 한다면 GET\s\S+
패턴으로 해당 경로를 찾아낼 수 있겠지만, 이 때에 후방 탐색을 사용하면 GET
문자열은 소비시키고 요청 경로만 반환할 수 있다.
(?<=GET\s)\S+
후방탐색은 뒤쪽에서부터 탐색을 하는 것으로 (?<=조건)
과 같이 조건을 입력한다. 위의 경우 조건 문자열(GET\s
) 이후에 발생하는 패턴만 찾을 수 있다.
/
/issView?iId=162604
/
/lunchwheel
/static/img/dropdown.png
/search
/search/login
/search/
/search/?s=keyword&sort=accuracy
/issView?iId=93989
전방탐색 ?=
- pcre
- pattern1(?=pattern2)
- vim
- pattern1(pattern2)\@=
전방탐색을 이용하면 조건 문자열 앞에 찾고자 하는 패턴을 찾아낼 수 있다.
400 대 에러가 발생했을 때에 어떤 요청을 했는지 찾아내고자 한다면, "[\S ]+"\s4\d\d\s\d+
패턴으로 찾아낸 뒤 후처리를 해줄 수도 있겠지만, 전방 탐색을 이용해서 바로 해당 요청값을 반환시킬 수 있다.
"[\S ]+"(?=\s4\d\d\s\d+)
위와 같은 패턴으로 예제 로그를 탐색하면 아래와 같은 결과를 확인할 수 있다.
"GET / HTTP/1.0"
"GET / HTTP/1.0"
"GET /static/img/dropdown.png HTTP/1.1"
부정형 전/후방 탐색
연산자 | 탐색 방법 |
---|---|
?= | 긍정형 전방 탐색 |
?! | 부정형 전방 탐색 |
?<= | 긍정형 후방 탐색 |
?<! | 부정형 후방 탐색 |