source

문자열 길이를 기준으로 문자열 트리밍

factcode 2022. 8. 16. 23:15
반응형

문자열 길이를 기준으로 문자열 트리밍

길이가 10자를 넘으면 줄을 자르고 싶어요.

가정합니다.String s="abcdafghijkl"에는 ), 의 ), will will will will will will will will음음음음음음음음음음음음음음음 ) ) )가 포함됩니다."abcdefgh..".

어떻게 하면 좋을까요?

s = s.substring(0, Math.min(s.length(), 10));

「」를 사용합니다.Math.min 수 있습니다.10.


주의:

  1. 위는 간단한 트리밍을 합니다.길 경우 Commons 를 합니다.StringUtils.abbreviate@H6의 솔루션을 참조해 주세요.유니코드 가로줄임표 문자를 사용하려면 @Basil의 솔루션을 참조하십시오.

  2. 「 」의인 .String,s.substring(0, s.length())s 것을 이 아니라String.

  3. 문자열에 BMP 외부에 Unicode 코드 포인트가 포함되어 있는 경우, 예를 들어 다음과 같이) 잘못 동작할1 수 있습니다.이모티콘.모든 Unicode 코드 포인트에서 올바르게 동작하는 (더 복잡한) 솔루션에 대해서는, @sibnick의 솔루션을 참조해 주세요.


- 0 0)에 없는 포인트는 " 쌍"으로 , 2개의 1 - 0 0 (BMP) " Unicode " " " " " " " " ( 2 ) ) " " " " " " " " " " " " " ( 2 ) " " " " ) " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "char을 설정합니다.String이를 무시하면 문자열이 10개 미만의 코드 포인트로 트리밍되거나 (더 나쁜) 서로게이트 쌍의 중간에 잘라질 수 있습니다. 반,는String.length()는 Unicode 텍스트 길이를 측정하는 데 적합하지 않기 때문에 해당 속성에 따라 트리밍하는 것은 올바르지 않을 수 있습니다.

StringUtils.abbreviate Apache Commons Lang 라이브러리의 친구가 될 수 있습니다.

StringUtils.abbreviate("abcdefg", 6) = "abc..."
StringUtils.abbreviate("abcdefg", 7) = "abcdefg"
StringUtils.abbreviate("abcdefg", 8) = "abcdefg"
StringUtils.abbreviate("abcdefg", 4) = "a..."

Commons Lang3에서는 커스텀 스트링을 대체 마커로 설정할 수도 있습니다.이를 통해 예를 들어 단일 문자 줄임표를 설정할 수 있습니다.

StringUtils.abbreviate("abcdefg", "\u2026", 6) = "abcde…"

Commons Apache Commons가 .StringUtils이 기능을 합니다.

s = StringUtils.left(s, 10)

len 문자를 사용할 수 없거나 String이 null인 경우 String은 예외 없이 반환됩니다.len이 음수인 경우 빈 문자열이 반환됩니다.

StringUtils.left(null, ) = null
StringUtils.left(, -ve) = " "

String "String Utils.left("", *) = " " "
"StringUtils.left("abc", 0) = " " "
2 "StringUtils.left("abc", 2) = "ab"
= "StringUtils.left("abc", 4) = "param"

String Utils.왼쪽 JavaDocs

우대:스티브 매콜리

평상시와 같이 UTF-16의 대리쌍은 아무도 신경 쓰지 않습니다.자세한 내용은 이쪽:실제로 사용되고 있는 가장 일반적인 비BMP Unicode 문자는 무엇입니까?org.apache.commons/commons-lang3의 저자까지

이 예에서는, 올바른 코드와 통상의 코드의 차이를 확인할 수 있습니다.

public static void main(String[] args) {
    //string with FACE WITH TEARS OF JOY symbol
    String s = "abcdafghi\uD83D\uDE02cdefg";
    int maxWidth = 10;
    System.out.println(s);
    //do not care about UTF-16 surrogate pairs
    System.out.println(s.substring(0, Math.min(s.length(), maxWidth)));
    //correctly process UTF-16 surrogate pairs
    if(s.length()>maxWidth){
        int correctedMaxWidth = (Character.isLowSurrogate(s.charAt(maxWidth)))&&maxWidth>0 ? maxWidth-1 : maxWidth;
        System.out.println(s.substring(0, Math.min(s.length(), correctedMaxWidth)));
    }
}

s = s.length() > 10 ? s.substring(0, 9) : s;

또는 String Utils가 없는 경우 다음 방법을 사용할 수 있습니다.

public static String abbreviateString(String input, int maxLength) {
    if (input.length() <= maxLength) 
        return input;
    else 
        return input.substring(0, maxLength-2) + "..";
}

문자열의 마지막 10자를 트리밍하고 유지하는 방법을 찾고 있는 경우에 대비합니다.

s = s.substring(Math.max(s.length(),10) - 10);

dr;dr

줄임표를 원하는 것 같네요.)는, 잘라낼 때의 마지막 자리입니다.입력 문자열을 조작할 수 있는 원라이너입니다.

String input = "abcdefghijkl";
String output = ( input.length () > 10 ) ? input.substring ( 0 , 10 - 1 ).concat ( "…" ) : input;

코드는 IdeOne.com에서 라이브로 실행됩니다.

abcdefghi...

삼항 연산자

삼진 연산자를 이용하면 원라이너를 만들 수 있습니다.

String input = "abcdefghijkl" ;

String output = 
    ( input.length() > 10 )          // If too long…
    ?                                
    input     
    .substring( 0 , 10 - 1 )         // Take just the first part, adjusting by 1 to replace that last character with an ellipsis.
    .concat( "…" )                   // Add the ellipsis character.
    :                                // Or, if not too long…
    input                            // Just return original string.
;

코드는 IdeOne.com에서 라이브로 실행됩니다.

abcdefghi...

자바 스트림

Java Streams 기능은 Java 9 이후부터 이를 흥미롭게 합니다.흥미롭긴 하지만 최선의 접근법은 아닐 수도 있습니다.

우리는보다는 코드 포인트를 사용한다.char가치.char매개 변수 형식은 된 유산을 관리하고 모든 가능한 유니 코드 문자의 하위 집합으로 제한되어 있다.

String input = "abcdefghijkl" ;
int limit = 10 ;
String output =
        input
                .codePoints()
                .limit( limit )
                .collect(                                    // Collect the results of processing each code point.
                        StringBuilder::new,                  // Supplier<R> supplier
                        StringBuilder::appendCodePoint,      // ObjIntConsumer<R> accumulator
                        StringBuilder::append                // BiConsumer<R,​R> combiner
                )
                .toString()
        ;

만약 우리가 가지고 있던 과도한 문자, 생략 부호와의 마지막 캐릭터 교체들의 길이를 줄였다.

if ( input.length () > limit )
{
    output = output.substring ( 0 , output.length () - 1 ) + "…";
}

내가 그"이상 제한, ellipsis 하"를 가진 유선을 모아 놓을 생각할 수 있다.

문제는 자바로지만, 생각이 2014년에 요청했다.
지금 코틀린사용하는 경우 이름만큼: 간단하다.

yourString.take(10)

반환합니다 문자열 이 문자열에서 첫번째 n문자를 포함하는, 또는 전체 문자열 이 문자열 키가 작다.

문서

str==null ? str : str.substring(0, Math.min(str.length(), 10))

또는,

str==null ? "" : str.substring(0, Math.min(str.length(), 10))

nullWorkswith.

//인 문자열의 길이 단축.. //님의 수업을 다음 메서드를 가중시킨다는 것입니다.

private String abbreviate(String s){
  if(s.length() <= 10) return s;
  return s.substring(0, 8) + ".." ;
}

언급URL:https://stackoverflow.com/questions/8499698/trim-a-string-based-on-the-string-length

반응형