URL 검증과 URL 추출은 서로 다른 문제야
- 입력 전체가 URL 모양인지 확인하려면 문자열 양끝을 고정해야 하고
- 긴 글에서 URL처럼 보이는 부분을 찾으려면 주변 문장과 만나는 경계를 정해야 해.
전체 문자열의 모양을 확인하는 패턴
^https?://[\w-]+(\.[\w-]+)+(/[\w./?%&=+#-]*)?$
이 예시는 HTTP나 HTTPS 스킴, 점이 하나 이상 있는 도메인, 선택적인 경로를 요구해. 어디까지나 제한된 모양 검사라 실제로 해석 가능한 모든 URL을 포괄하지는 않아.
본문에서 URL 후보를 찾는 패턴
https?://[^\s)]+
스킴 뒤에서 공백이나 닫는 괄호 전까지를 잡아. 그래서 (https://example.com)처럼 괄호 안에 든 주소에서 마지막 괄호를 제외할 수 있어.
문장부호를 정리할 때 URL의 문법까지 지우지 마
문장 끝의 점, 쉼표, 느낌표가 후보에 붙을 수 있어. 매칭 뒤에 제거한다면 .,;:!처럼 문장 끝으로 쓰인 기호만 보수적으로 걷어 내. string.punctuation 전체를 지우면 유효한 마지막 /나 ?까지 사라질 수 있어.
최종 판정과 해석은 URL 라이브러리에 맡겨
IP 리터럴, 포트, 국제화 도메인, 조각 식별자, 인코딩까지 정규식 하나로 검증하려 들면 패턴이 금방 무너져. Python은 urllib.parse.urlparse, JavaScript는 new URL(...), Go는 net/url처럼 대상 언어의 파서를 사용해.