생계유지형 개발자/Etc.

[Java] 문자열에서 URL 찾아서 치환하기 (정규 표현식 제일 정확함)

이 가을 2023. 3. 23. 18:52

자바로 문자열에서 URL을 찾아서 다른 문자로 치환하는 기능이 필요했다.

당연히 인터넷 검색해서 이것저것 찾아봤는데 다양한 url 형식을 모두 찾아내는 정확한 정규식은 잘 없었다.

검색해서 찾은 것 + 내가 수정 및 변형해서 최종적으로 아래 정규식이 제일 정확했다.

문자열 속에서 2차, 3차 도메인과 쿼리스트링은 물론 URL에 한글 포함된 경우도 찾을 수 있다.

 

정규 표현식

Regular Expression
((http[s]?|ftp):\/\/)?(?:www\.)?[-a-zA-Z0-9@:%._\+~#=가-힣]{1,256}[:|\.][a-zA-Z0-9()]{1,6}\b(?:[-a-zA-Z0-9()@:%_\+,.~#?&\/=가-힣]*)

as a Java string
"((http[s]?|ftp):\\/\\/)?(?:www\\.)?[-a-zA-Z0-9@:%._\\+~#=가-힣]{1,256}[:|\\.][a-zA-Z0-9()]{1,6}\\b(?:[-a-zA-Z0-9()@:%_\\+,.~#?&\\/=가-힣]*)"

 

url 치환 소스코드 (자바)

  /**
     * 문자열에서 URL찾아서 A태그로 감싼다.
     *
     * @param origin
     * @return
     */
    public static String convertLinkToATag(String origin) {
        String urlPattern = 	"((http[s]?|ftp):\\/\\/)?(?:www\\.)?[-a-zA-Z0-9@:%._\\+~#=가-힣]{1,256}[:|\\.][a-zA-Z0-9()]{1,6}\\b(?:[-a-zA-Z0-9()@:%_\\+,.~#?&\\/=가-힣]*)";
        Pattern pt = Pattern.compile(urlPattern);
        Matcher mc = pt.matcher(origin);

        StringBuffer sb = new StringBuffer();
        while (mc.find()) {
            mc.appendReplacement(sb, Matcher.quoteReplacement( "<a class='clink' href='" + mc.group() + "' target='_blank'>" + mc.group() + "</a>"));
        }
        mc.appendTail(sb);

        return sb.toString();
    }

 

https://www.regexplanet.com/advanced/java/index.html