정규식을 이용한 예외처리
더욱 복잡하고 어지러운 상황들을 예외처리하고, 완벽하게 설계해봅시다.
캐릭터 코드
간혹 다른 이미지 호스팅 서비스를 이용하여 폴더명이 영문인 경우가 있습니다.
이 경우 캐릭터의 한글 이름을 그대로 링크에 대입하는 것은 어렵습니다.
이 경우, 조금은 번거롭더라도 각 캐릭터별로 매칭을 해주는 것이 현실적인 방법입니다.
예를 들어, 아래와 같은 상황을 가정해 보겠습니다.
markdown
"린" 캐릭터는 "rin" 폴더에 존재
"다인" 캐릭터는 "dain" 폴더에 존재
"엘리" 캐릭터는 "eli" 폴더에 존재
...이 경우, 아래와 같이 캐릭터별로 정규식을 구성하면 호환성을 깨지 않고 제작할 수 있습니다.
markdown
정규식: \{\{img::린/(.*?)\}\}
대체식: 
정규식: \{\{img::다인/(.*?)\}\}
대체식: 
...캡쳐 범위 제한
이미지의 숫자 범위는 1 ~ 15까지인데, 16이 오면 어떻게 해야 할까요? 17이 오면?
또한, 제3자의 캐릭터가 나와버려서 캐릭터명에 없는 데이터가 나온다면?
이 경우, 정확히 등록된 이미지만 정규식으로 바꾸도록 범위를 제한해볼 수 있습니다.
먼저 범위를 탐색해 봅시다. 다음과 같이 4개의 구역으로 나눌 수 있습니다.
각 구역의 이미지에 대해, 아래와 같이 구성해보고자 합니다.
- 둘 다 올바르면 출력
- 코드만 어긋난 경우 기본 코드로 변경하여 수정
- 캐릭터명만 어긋난 경우 익명의 실루엣 이미지로 수정
- 둘 다 어긋난 경우 숨김먼저 캐릭터 이름을 제한하는 방법입니다.
기존의 (.*?)가 모든 데이터를 캡처했다면, 아래와 같이 명시해줄 경우 특정 키워드만 캡처할 수 있습니다.
(키워드1|키워드2|키워드3|키워드4)파이프 (|) 기호를 사용하여 키워드 간 구분을 해줄 수 있습니다.
이때, 공백 역시 엄격하게 포함하기 때문에 파이프 앞뒤로 띄어쓰기는 하면 안됩니다.
다음으로 숫자 제한 방법입니다.
기본적으로 "구간"이 아닌 "문자열"로 캡쳐하기 때문에, 다소 난해한 면이 있습니다.
먼저 1부터 9까지인 경우입니다. 이 경우 구간 문법으로 간단히 나타낼 수 있습니다.
markdown
([1-9])다음으로 1부터 10까지인 경우입니다.
이 경우 자리수가 바뀌기 때문에, 이전에 설명한 파이프 기호를 사용해야 합니다.
핵심 메커니즘은 자리수를 기준으로 분류하는 것입니다.
1부터 9까지의 수를 한 자리수 묶음으로, 10은 두 자리수 묶음으로 인식해야 합니다.
markdown
(10|[1-9])예시의 경우 큰 수부터 하나씩 걸러냄을 알 수 있습니다.
범위의 경우 큰 수부터 하나씩 만들어내는 것이 유리합니다.
1 ~ 345라는 예시를 들어보겠습니다.
아래와 같이, 큰 수들이 주로 포함된 구간부터 만들어나가야 합니다.
markdown
340 ~ 345
300 ~ 339
100 ~ 299
1 ~ 99위의 3개는 비교적 간단합니다. 아래와 같이 만들어 구축할 수 있습니다.
markdown
340 ~ 345: 34[0-5]
300 ~ 339: 3[0-3][0-9]
100 ~ 299: [1-2][0-9][0-9]1 ~ 99의 경우 약간의 트릭이 필요합니다.
결론부터 말하면, 아래 방법을 사용합니다.
markdown
[1-9][0-9]{0,1}맨 마지막의 {0,1} 기호는 이전 데이터가 0개에서 1개 사이로 올 수 있다입니다.
맨 앞의 숫자 범위는 0을 빼고, 나머지는 선택적으로 붙이는 트릭을 이용한 방법입니다.
최종적인 결과는 아래와 같습니다.
markdown
(34[0-5]|3[0-3][0-9]|[1-2][0-9][0-9]|[1-9][0-9]{0,1})이제 이를 이용하면, 4개의 매크로를 이용해 범위를 명확히 하여 외부 이미지 찐빠를 99% 잡아낼 수 있습니다.
markdown
설정: 캐릭터명은 "린", "다인", "엘리"만, 이미지 번호는 1 ~ 10까지만
[매크로 1]
- 정규식: \{\{img::(린|다인|엘리)/([1-9]|10)\}\}
- 대체식: 
[매크로 2]
- 정규식: \{\{img::(린|다인|엘리)/(.*?)\}\}
- 대체식: 
[매크로 3]
- 정규식: \{\{img::(.*?)/([1-9]|10)\}\}
- 대체식: 
[매크로 4]
- 정규식: \{\{img::(.*?)\}\}
- 대체식: (없음)💡 2, 3번 매크로 설명
2번 매크로의 경우 숫자 부분을 (.*?) 기호 (아무거나)로 설정하였습니다.
이는 조건에 맞는 경우(1 이상 10 이하)는 이미 매크로 1에서 대체되었기 때문에, 올바른 이미지는 여기에 걸리지 않습니다.
3번 매크로 역시 동일한 원리입니다.
조건에 맞는 경우(린, 다인, 엘리)는 이미 매크로 1에서 대체되었기 때문에, 마찬가지로 여기 걸리지 않습니다.