ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • abbreviate (줄여쓰기)를 정규표현식으로 구현해보기
    JAVA/tips 2022. 5. 3. 18:31
    반응형

    개인의 취향

    입력받은 문자열이 너무 길 경우, 간혹 끝 부분을 ... 와 같이 줄여서 사용하기도 한다.
    이 기능은 org.apache.commons.lang.StringUtils#abbreviate()에서 제공하고 있지만
    저거 하나 쓰려고 라이브러리를 추가하기에는...
    이부분은 개인의 취향이니 더 이상 언급하지 않겠다. ㅎ

    패턴

    먼저 정규표현식의 패턴을 알아야한다.
    기본적인 사용법은 다른곳에 많이 소개가 되어 있으니 생략하고
    우리는 패턴에 집중해보자.

    우리가 사용할 패턴은 후방탐색(Lookbehind) 패턴이다.
    후방탐색 패턴은 (?<=Y)X와 같이 표현하며, Y를 뒤따르는 X를 탐색한다는 의미이다.

    원리는 간단하다. Y 패턴 뒤에 나올 X를 찾으면 된다.
    예를들면 ABCDEFGHIJ 문자열에서 5번째 뒤의 문자열들을 찾으려면? (?<=.{5}).+ 로 하면 된다.

    패턴에서 사용된 표현식들을 간단하게 설명하면,

    • .은 모든 문자를 의미하며
    • {5}는 앞의 문자가 5번 반복된다는걸 의미한다.
    • 위의 3개를 연결해서 (?<=.{5}) 패턴을 만들고, 이는 처음부터 5번째 문자열 뒤에 오는 문자들을 탐색한다는 의미가 된다.
    • 마지막으로 .+를 통해 6번째 부터 마지막까지 문자들을 매칭하게 된다.

    자 그럼 이걸 코드로 만들어보자.

    코드

    public static String abbreviate(String input, int size) {
        if (input.length() <= size) {
            return input;
        }
    
        String pattern = String.format("(?<=.{%d}).+", size - 3);
        return input.replaceAll(pattern, "...");
    }

    inputsize 두 개의 파라미터를 받아서 전체 길이가 size보다 클 경우만 줄여쓰기를 수행한다.
    즉, 아래 표와 같은 결과가 나온다.

    input size 결과
    "0123456789" 10 "0123456789"
    "0123456789" 9 "012345..."
    "0123456789" 8 "01234..."

    단, 위의 코드는 한 줄로 표현된 문자열에 대해서만 정상 동작하므로
    장문의 문장들을 줄이는데는 사용할 수 없다.
    이부분은 추후에 다시 포스팅 하도록 하겠다.

     

    끝~

    반응형

    댓글

Designed by Tistory.