Java String.trim ()은 몇 개의 공백을 제거합니까?


117

Java에서는 다음과 같은 문자열이 있습니다.

"     content     ".

이면에있는 String.trim()모든 공간을 제거합니까 아니면 각각에 하나의 공간 만 제거합니까?


197
반대자에게 : 당신의 행동은 겸손합니다. 이 질문은 상세하고 구체적이며 명확하고 간단하게 작성되어 적어도 한 명의 다른 프로그래머에게 흥미가 있습니다. 사람들은 javadoc이나 소스 코드를 어디에서 찾을 지 모를 수 있습니다. 우리의 임무는 그들을 돕는 것이지 무지하다고 때리는 것이 아닙니다.
glmxndr 2010

14
@subtenante, 당신이 맞습니다. 나는 이전에 구글 같은 질문을하는 사람들을 변호하기도했다. 그러나 이와 같이 간단한 것은 스스로 테스트해야하며 IMO는 Q & A 사이트에 질문을 게시하는 것을 보증해서는 안됩니다. 제목은 오해의 소지가 있으며 Q는 읽는 모든 사람에게 시간 낭비입니다.
크리스

9
@Chris : oneat이 소스 코드를 볼 기회를주었습니다. trim ()에 대해 많이 배웠습니다. 나는 그렇지 않았을 것입니다. 모든 사람은 자신의 시간을 소비하는 책임이 있습니다. oneat은 그의 겉보기에 순진한 질문에서 이익을 얻을 수 없다는 우리를 비난해서는 안됩니다.
glmxndr 2010

1
@skaffman : (c) "시도하고 보자"여야하고, 그 다음에야 (d) 그렇게 물어보세요.
Mac

2
이 질문은 누구나 매뉴얼에서 찾을 수 있고 1 분 안에 테스트 할 수 있어야하기 때문에 주제에서 벗어난 것으로 보입니다.
재스퍼

답변:


168

그들 모두 .

반환 값 : 선행 및 후행 공백이 제거 된이 문자열의 복사본 또는 선행 또는 후행 공백이없는 경우이 문자열.

~ Java 1.5.0 문서에서 인용

(하지만 왜 직접 시도하지 않았습니까?)


1
이 답변은 문서가 "공백"으로 의미하는 바를 다루지 않기 때문에 아래로 투표해야했습니다. 그것이 사실 일 것이라는 것은 논리적으로 보이지만 그것이 "공백"이 의미 Chararacter.isWhitespace하는 것은 아닙니다 ..
user2864740

7
@ user2864740 :이 답변의 포괄적 인 분석을 수 없습니다 trim, isWhiteSpace등, 또는 자바 문서의 모호성에 대한 설명; 위에서 질문 한 특정 질문에 대한 간단한 대답입니다. 즉, trim방법이 단일 공백 ​​또는 다중 공백을 제거합니까?
LukeH 2013-12-02

나는 그렇지 않다는 것을 압니다. 나는 통과시에도 그런 지적을하지 못해 반대표를 던졌다. 어쨌든 업데이트가되지 않으면 투표를 취소 할 수 없습니다.
user2864740 '132013-12-02

33

소스 코드에서 (디 컴파일 됨) :

  public String trim()
  {
    int i = this.count;
    int j = 0;
    int k = this.offset;
    char[] arrayOfChar = this.value;
    while ((j < i) && (arrayOfChar[(k + j)] <= ' '))
      ++j;
    while ((j < i) && (arrayOfChar[(k + i - 1)] <= ' '))
      --i;
    return (((j > 0) || (i < this.count)) ? substring(j, i) : this);
  }

while볼 수 있는 두 개 는 유니 코드가 공백 문자 아래에있는 시작과 끝의 모든 문자가 제거되었음을 의미합니다.


27

확실하지 않은 경우 단위 테스트를 작성하십시오.

@Test
public void trimRemoveAllBlanks(){
    assertThat("    content   ".trim(), is("content"));
}

주의 : 물론 테스트 (JUnit + Hamcrest 용)는 실패하지 않습니다.


43
... 어떻게 결과가 무엇인지 볼 수있는 단위 테스트를 할 수있는에서 System.out.println을 수행하는 방법 만 배운 새로운 프로그래머를 물어
jaxkodex

26

그러나 한 가지 지적 할 점은 String.trim이 "공백"이라는 독특한 정의를 가지고 있다는 것입니다. 유니 코드 공백을 제거하지는 않지만 공백을 고려하지 않는 ASCII 제어 문자도 제거합니다.

이 메서드는 문자열의 시작과 끝에서 공백을 제거하는 데 사용할 수 있습니다. 실제로 모든 ASCII 제어 문자도 잘립니다.

가능하다면 유니 코드 공백도 처리하는 Commons Lang의 StringUtils.strip ()을 사용할 수 있습니다 (널 안전함).


3
디자이너 부분에 대한 끔찍한 감독처럼 보입니다. .. 문서의 지나치게 기술적 인 작업은별로 도움이되지 않습니다.
user2864740 2013

2
브라보! StackOverflow에서 가장 간단한 질문을 받았고 그것에 대해 말할 수있는 지능적인 것을 찾았습니다. 당신은 경주에 대한 신용입니다.
Mark McKenna 2014 년

3
@MarkMcKenna : 이처럼 매우 간단한 프로그래밍 질문 (문자열 자르기, 파일 이름 확장명 찾기 등)에는 항상 숨겨진 복잡성 이 있다는 사실을 계속 발견합니다 . 그것은 우리의 기술과 도구에 대한 약간의 환멸입니다.
Thilo

15

String 클래스에 대한 API 를 참조하십시오 .

선행 및 후행 공백이 생략 된 문자열의 복사본을 반환합니다.

양쪽의 공백이 제거됩니다.

참고 trim()문자열 인스턴스를 변경하지 않습니다, 그것은 새로운 객체를 반환합니다 :

 String original = "  content  ";
 String withoutWhitespace = original.trim();

 // original still refers to "  content  "
 // and withoutWhitespace refers to "content"

1
실제로 아무것도 String 인스턴스를 변경할 수 없습니다 (VM을 중단시킬 수있는 더러운 것 제외)
AvrDragon

13

자바 문서를 기반으로 여기.trim()일반적으로 공백으로 알려져을 대체 '\ u0020'.

그러나 '\ u00A0'( Unicode NO-BREAK SPACE &nbsp; )도 공백으로 간주됩니다..trim() 제거하지 않습니다. 이것은 특히 HTML에서 일반적입니다.

그것을 제거하려면 다음을 사용합니다.

tmpTrimStr = tmpTrimStr.replaceAll("\\u00A0", "");

이 문제의 예가 여기 에서 논의 되었습니다 .


Javadoc을 기반으로 선행 및 후행 공백을 제거합니다 . 여기에는 공백, 탭, 개행 캐리지 리턴, 양식 피드 등이 포함 되며 선행 또는 후행이 아닌 문자는 제외됩니다 .
Marquis of Lorne

감사합니다, 그것은 충당 저를하는 데 도움이
아사드 하이더

8

trim()공백을 제거하는 Java의 예 :

public class Test
{
    public static void main(String[] args)
    {
        String str = "\n\t This is be trimmed.\n\n";

        String newStr = str.trim();     //removes newlines, tabs and spaces.

        System.out.println("old = " + str);
        System.out.println("new = " + newStr);
    }
}

산출

old = 
 This is a String.


new = This is a String.

4

자바 문서 (문자열 클래스 소스)에서,

/**
 * Returns a copy of the string, with leading and trailing whitespace
 * omitted.
 * <p>
 * If this <code>String</code> object represents an empty character
 * sequence, or the first and last characters of character sequence
 * represented by this <code>String</code> object both have codes
 * greater than <code>'&#92;u0020'</code> (the space character), then a
 * reference to this <code>String</code> object is returned.
 * <p>
 * Otherwise, if there is no character with a code greater than
 * <code>'&#92;u0020'</code> in the string, then a new
 * <code>String</code> object representing an empty string is created
 * and returned.
 * <p>
 * Otherwise, let <i>k</i> be the index of the first character in the
 * string whose code is greater than <code>'&#92;u0020'</code>, and let
 * <i>m</i> be the index of the last character in the string whose code
 * is greater than <code>'&#92;u0020'</code>. A new <code>String</code>
 * object is created, representing the substring of this string that
 * begins with the character at index <i>k</i> and ends with the
 * character at index <i>m</i>-that is, the result of
 * <code>this.substring(<i>k</i>,&nbsp;<i>m</i>+1)</code>.
 * <p>
 * This method may be used to trim whitespace (as defined above) from
 * the beginning and end of a string.
 *
 * @return  A copy of this string with leading and trailing white
 *          space removed, or this string if it has no leading or
 *          trailing white space.
 */
public String trim() {
int len = count;
int st = 0;
int off = offset;      /* avoid getfield opcode */
char[] val = value;    /* avoid getfield opcode */

while ((st < len) && (val[off + st] <= ' ')) {
    st++;
}
while ((st < len) && (val[off + len - 1] <= ' ')) {
    len--;
}
return ((st > 0) || (len < count)) ? substring(st, len) : this;
}

시작과 길이를 얻은 후에는 String 클래스의 하위 문자열 메서드를 호출합니다.


여기서 "공백"은 "\ x20보다 작거나 같은 값을 가진 문자".. brillant입니다.
user2864740 2013

3

trim()모든 선행 및 후행 공백을 제거합니다. 하지만주의하세요 : 문자열은 변경되지 않습니다. trim()대신 새 문자열 인스턴스를 반환합니다.


모든 선행 및 후행 공백을
Marquis of Lorne

3

문자열 입력이 다음과 같은 경우 :

String a = "   abc   ";
System.out.println(a);

예, 출력은 "abc"입니다. 그러나 문자열 입력이 다음과 같은 경우 :

String b = "    This  is  a  test  "
System.out.println(b);

Output will be This is a test So trim은 문자열에서 첫 번째 문자 앞과 마지막 문자 뒤의 공백 만 제거하고 내부 공백을 무시합니다. 이것은 String내부 공간을 제거하고 문자열의 첫 번째와 마지막 문자 앞뒤의 공백을 제거 하는 내장 트림 메서드 를 약간 최적화하는 코드입니다 . 도움이 되었기를 바랍니다.

public static String trim(char [] input){
    char [] output = new char [input.length];
    int j=0;
    int jj=0;
    if(input[0] == ' ' )    {
        while(input[jj] == ' ') 
            jj++;       
    }
    for(int i=jj; i<input.length; i++){
      if(input[i] !=' ' || ( i==(input.length-1) && input[input.length-1] == ' ')){
        output[j]=input[i];
        j++;
      }
      else if (input[i+1]!=' '){
        output[j]=' ';
        j++;
      }      
    }
    char [] m = new char [j];
    int a=0;
    for(int i=0; i<m.length; i++){
      m[i]=output[a];
      a++;
    }
    return new String (m);
  }

이 답변의 처음 두 문장은 명백히 잘못되었으며 출력은 "abc" 가 아닙니다 . 아마도 당신은 .trim()에서 잊었 System.out.println(a);습니까?
Arjan


2

한 가지 매우 중요한 점은 전적으로 "공백"으로 구성된 문자열이 빈 문자열을 반환한다는 것입니다.

경우 string sSomething = "xxxxx", 어디에 x공백에 대한 서, sSomething.trim()빈 문자열을 반환합니다.

경우 string sSomething = "xxAxx", 어디에 x공백 방치 sSomething.trim()돌아갑니다 A.

경우 sSomething ="xxSomethingxxxxAndSomethingxElsexxx", sSomething.trim()반환 SomethingxxxxAndSomethingxElse통지의 수 있음을 x단어 사이는 변경되지 않습니다.

trim()이 게시물에 표시된 것처럼 깔끔한 패킷 문자열 을 정규식과 결합 하려면 Java를 사용하여 문자열에서 중복 공백을 제거하는 방법? .

순서는 결과에 의미가 없지만 trim()먼저 더 효율적입니다. 도움이 되었기를 바랍니다.


2

String에 대해 하나의 인스턴스 만 유지하려면 다음을 사용할 수 있습니다.

str = "  Hello   ";

또는

str = str.trim();

그러면 str문자열 의 값은str = "Hello"



0

String 용 Javadoc 에는 모든 세부 정보가 있습니다. 양쪽 끝에서 공백 (공백, 탭 등)을 제거하고 새 문자열을 반환합니다.


0

어떤 방법을 수행할지 확인하려면 BeanShell 을 사용할 수 있습니다 . 가능한 한 Java에 가깝도록 설계된 스크립팅 언어입니다. 일반적으로 말하면 약간의 완화가있는 Java로 해석됩니다. 이런 종류의 또 다른 옵션은 Groovy 언어입니다. 이 두 스크립팅 언어는 통역 언어에서 알고있는 편리한 Read-Eval-Print 루프를 제공합니다. 따라서 콘솔을 실행하고 다음을 입력 할 수 있습니다.

"     content     ".trim();

(또는 Groovy 콘솔)을 "content"누르면 결과가 표시 됩니다 .EnterCtrl+R


6
따라서 Java의 방법을 이해하려면 완전히 새로운 언어를 배워야합니다. 정말?
james.garriss 2013-08-21

0
String formattedStr=unformattedStr;
formattedStr=formattedStr.trim().replaceAll("\\s+", " ");

이것은 질문과 관련이 없습니다.
Mark McKenna 2014 년

2
@ 마크 그러나 실수는 내가이 질문에 ... 열 때 무엇을보고 하였다
Armfoot

또한 무의미합니다. trim()이미 어떤 수행 repkaceAll()이 할 떠났다 것도이 있다면, 할 것입니다.
Marquis of Lorne

트림은 선행 및 후행 공백을 처리 할 동안 @EJP 완전히 대체하기는 또한, 하나의 공간 문자열에 공백을 대체 할 것이다
크리슈나
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.