JAVA/tips

abbreviate (줄여쓰기)를 정규표현식으로 구현해보기

hun.a 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..."

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

 

끝~

반응형