Java 문자열이 모두 공백이 아닌지 어떻게 확인합니까?


132

Java를 사용하여 Java String 또는 문자 배열이 공백으로 구성된 것이 아닌지 확인하고 싶습니까?

이것은 자바 스크립트를 제외하고는 매우 비슷한 질문입니다.
문자열에 공백뿐만 아니라 문자 및 공백이 포함되어 있는지 어떻게 확인할 수 있습니까?

편집 : 영숫자 문자에 대한 비트를 제거 했으므로 더 의미가 있습니다.


3
공백에 대한 여러 가지 다른 정의가 있습니다. 스프레드 시트 : Google 스프레드 시트 또는 "영숫자 문자가 있습니다"라고 말하면 완전히 다른 것입니다. 명확히하십시오.
Kevin Bourrillion

혼란에 대한 사과 ... 모든 공백이 핵심은 아닙니다. 기본적으로 모든 공백 문자가 있으면 제외하고 싶습니다. 내용이 없으므로 제외합니다.
Ankur

1
JDK / 11을 사용하면String.isBlank API를 사용할 수 있습니다 .
Naman

답변:


224

내가 생각할 수있는 가장 짧은 해결책 :

if (string.trim().length() > 0) ...

공백 만 검사합니다. 특정 문자 클래스를 확인하려면 다음 match()과 같은 정규 표현식 을 사용하십시오 .

if (string.matches(".*\\w.*")) ...

... 적어도 하나 이상의 (ASCII) 영숫자를 확인합니다.


9
FWIW : 첫 번째 솔루션이 훨씬 더 빠를 것으로 기대합니다.
Stephen C

2
@Stephen C : 물론입니다! @Uri가 지적했듯이, 나는 질문의 모호성에 두 개의 서로 다른 문제의 감사를 해결하는 데 :) 또한, 나는 거의 사용하지 matches(): 성능을 위해, 나는 일반적으로 저장 PatternA의 final static. 동일한 코드가 자주 실행되면 돈을 지불합니다.
Carl Smotricz

3
@Andreas_D : Heh, 나는 나의 명령을 받았다! OP는 문자열 또는 문자 배열을 확인하고 싶다고 말했지만 결코 null에 대해 아무 말도하지 않았습니다! :) * 계약서의 글씨를 확인합니다 * "" null문자열이 아닙니다! "
Carl Smotricz

1
또한 "\\ w"는 AZ, az, 0-9 및 밑줄로 정의 된 "단어 문자"를 나타 내기 때문에 모든 공백이 아닌 공백이 아닌 문자의 제한된 하위 집합과 만 일치합니다.
Rob Raisch

2
나는 your_string.trim (). isEmpty ()를 사용하고 나를 위해 일했습니다
Neri

59

Apache Commons Lang 라이브러리를 사용합니다. 여기에는 모든 종류의 문자열 작업에 유용한 StringUtils라는 클래스가 있습니다. 문자열이 모든 공백이 아닌지 확인하려면 다음을 사용할 수 있습니다.

StringUtils.isBlank(<your string>)

참조는 다음과 같습니다. StringUtils.isBlank


8
선택한 답변을 사용하는 것과 비교 하여이 솔루션을 선호합니다. 이것은 또한 문자열 == null을 검사합니다
Richard

이것은 이제 올바르지 않습니다. StringUtils.isEmpty""을 (를) 전달하면 false가 반환됩니다.
제임스 스펜스

53

Carl Smotricz가 언급 한 것보다 약간 짧음 :

!string.trim().isEmpty();

10
당신은 젊은 whippersnappers와 당신의 새로운 자바 후 1.6 속임수! 진심으로, 우리 회사의 적어도 하나의 프로젝트는 여전히 Java 1.4 (한숨)에서 실행됩니다.
칼 스 모트 리츠

더 짧습니까? 예. 개인적으로 저는 좀 더 장황한 코딩 스타일을 좋아합니다
Michel


9

Java 11을 사용하는 경우 새 isBlank문자열 메소드가 유용합니다.

!s.isBlank();

당신이 사용하는 경우 자바 8, 9 또는 10을 , 당신은 문자열이 공백뿐만 아니라 있는지 확인하는 간단한 스트림을 만들 수있다 :

!s.chars().allMatch(Character::isWhitespace));

Apache Commons Lang과 같은 타사 라이브러리가 필요하지 않은 것 외에도 이러한 솔루션은 다른 많은 답변에서 제안 된 기반 솔루션 ' '과 같이 일반 공백 뿐만 아니라 공백 문자를 처리 할 수 ​​있다는 이점이 trim있습니다. 지원되는 모든 공백 유형의 전체 목록은 Javadoc 을 참조하십시오 . 빈 문자열도 두 경우 모두 적용됩니다.


5
if(target.matches("\\S")) 
    // then string contains at least one non-whitespace character

"비 공백 문자"를 의미하는 백 슬래시 cap-S 사용 참고

가장 간단한 솔루션 일 것입니다.


2
시도해보십시오. String year="1995"; year.matches("\\S"); will return false그래서 이것은 올바른 해결책이 아닙니다. : |
Nhat Dinh

6
아니, 당신은 내가 왜 설명을 잃고 있지만 맞습니다. Java 문서에 따르면 String.matches는 주어진 문자열이 정규식과 일치하는지 확인합니다. 약간의 실험은 제공된 정규 표현식이 ENTIRE 문자열과 일치하는 경우에만이 기능이 일치하는 것처럼 보이기 때문에 이것이 완전히 정확하지는 않음을 보여줍니다! 따라서 위의 정규식 ( "\\ S")을 "^. * \\ S. * $"로 변경하면 예상대로 작동하지만이 동작은 올바르게 문서화되지 않았으며 문자열 일치의 다른 모든 구현과 크게 다른 것처럼 보입니다. 정규식 사용.
Rob Raisch

4

이 답변 " 즉, 적어도 하나의 영숫자 문자가 있습니다 "라는 주석에 더 중점을 둡니다 . 그 외에도 String이 인 경우 NPE로 당신을 해치지 않는 것을 제외하고는 다른 (이전) 솔루션에 너무 많이 추가되지 않습니다 null.

우리는 원하는 false(1) 일이야 경우 null또는 (2)의이 비어 있거나 (3) 만 whitechars를 포함이야.

public static boolean containsNonWhitespaceChar(String s) {
  return !((s == null) || "".equals(s.trim()));
}

4

공백 만 확인하고 null을 신경 쓰지 않으면 org.apache.commons.lang.StringUtils.isWhitespace (String str)를 사용할 수 있습니다.

StringUtils.isWhitespace(String str);

(문자열에 공백 만 포함되어 있는지 확인합니다.)

null (공백 포함)도 확인하려면

StringUtils.isBlank(String str);

isBlank (String)은 null 유효성 검사도 처리하므로 권장됩니다!
Sachidananda Naik

2

Java-11 +에서는 String.isBlankAPI를 사용 하여 주어진 문자열이 모두 공백으로 구성되어 있지 않은지 확인할 수 있습니다.

String str1 = "    ";
System.out.println(str1.isBlank()); // made up of all whitespaces, prints true

String str2 = "    a";
System.out.println(str2.isBlank()); // prints false

동일한 javadoc은 다음과 같습니다.

/**
 * Returns {@code true} if the string is empty or contains only
 * {@link Character#isWhitespace(int) white space} codepoints,
 * otherwise {@code false}.
 *
 * @return {@code true} if the string is empty or contains only
 *         {@link Character#isWhitespace(int) white space} codepoints,
 *         otherwise {@code false}
 *
 * @since 11
 */
public boolean isBlank()

1

트림 방법은 당신에게 잘 작동합니다.

http://download.oracle.com/docs/cd/E17476_01/javase/1.4.2/docs/api/java/lang/String.html#trim ()

선행 및 후행 공백이 생략 된 문자열의 사본을 리턴합니다. 이 String 객체가 빈 문자 시퀀스를 나타내거나이 String 객체가 나타내는 문자 시퀀스의 첫 번째 및 마지막 문자가 모두 '\ u0020'(공백 문자)보다 큰 코드를 갖는 경우이 String 객체에 대한 참조가 반환됩니다.

그렇지 않으면 문자열에 코드가 '\ u0020'보다 큰 문자가 없으면 빈 문자열을 나타내는 새 String 객체가 만들어지고 반환됩니다.

그렇지 않으면, 코드가 '\ u0020'보다 큰 문자열에서 k가 첫 번째 문자의 색인이고 m이 문자열이 '\ u0020'보다 큰 문자열의 마지막 문자의 색인이되도록하십시오. 색인 k의 문자로 시작하고 색인 m의 문자, 즉 this.substring (k, m + 1)의 결과로 끝나는이 문자열의 하위 문자열을 나타내는 새 String 객체가 작성됩니다.

이 방법을 사용하면 문자열의 시작과 끝에서 공백을 트리밍 할 수 있습니다. 실제로 모든 ASCII 제어 문자도 자릅니다.

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

빈 문자열을 자른 다음 비교하거나 길이가 0인지 확인할 수 있습니다.


답변 링크가 죽었습니다 -404 | 죄송합니다. 페이지가 존재하지 않거나 더 이상 사용할 수 없습니다 .
Pang

0

대안 :

boolean isWhiteSpaces( String s ) {
    return s != null && s.matches("\\s+");
 }

1
\\ s *는 공백이 있거나없는 모든 문자열과 일치합니다. 아마도 당신은 \\ s +를 의미합니까?
Rob Raisch

0

trim () 및 다른 언급 된 정규식은 모든 유형의 공백에 대해 작동하지 않습니다

예 : 유니 코드 문자 'LINE SEPARATOR' http://www.fileformat.info/info/unicode/char/2028/index.htm

Java 함수 Character.isWhitespace ()는 모든 상황을 다룹니다.

그렇기 때문에 이미 언급 한 솔루션 StringUtils.isWhitespace (String) / 또는 StringUtils.isBlank (String)을 사용해야합니다.


0
StringUtils.isEmptyOrWhitespaceOnly(<your string>)

확인합니다 :-그것은 null입니까-공간 만입니까-빈 문자열 ""

https://www.programcreek.com/java-api-examples/?class=com.mysql.jdbc.StringUtils&method=isEmptyOrWhitespaceOnly


1
도서관에서 왔나요? 프로젝트에 연결하십시오. 아니면 Java에 내장되어 있습니까? 패키지를 나타냅니다.
Basil Bourque

나는이 com.mysql.jdbc.StringUtils.isEmptyOrWhitespaceOnly 생각 @BasilBourque
ahmet_y

0

openjdk 13, Windows 10에서 성능을 비교 한 것입니다. 각 텍스트마다 :

"abcd"
"    "
" \r\n\t"
" ab "
" \n\n\r\t   \n\r\t\t\t   \r\n\r\n\r\t \t\t\t\r\n\n"
"lorem ipsum dolor sit amet  consectetur adipisici elit"
"1234657891234567891324569871234567891326987132654798"

다음 테스트 중 하나를 실행했습니다.

// trim + empty
input.trim().isEmpty()

// simple match
input.matches("\\S")

// match with precompiled pattern
final Pattern PATTERN = Pattern.compile("\\S");
PATTERN.matcher(input).matches()

// java 11's isBlank
input.isBlank()

각 10.000.000 회.

결과 :

METHOD    min   max   note
trim:      18   313   much slower if text not trimmed
match:   1799  2010   
pattern:  571   662   
isBlank:   60   338   faster the earlier hits the first non-whitespace character

놀랍게도 트림 + 빈이 가장 빠릅니다. 잘린 텍스트를 구성해야하는 경우에도 마찬가지입니다. 공백이 아닌 하나의 문자를 찾는 간단한 for-loop는 여전히 빠릅니다 ...

편집 : 텍스트가 길수록 숫자가 다릅니다. 긴 텍스트 자르기는 단순한 루프보다 시간이 오래 걸립니다. 그러나 정규식은 여전히 ​​가장 느린 솔루션입니다.


0

개인적으로 나는 !str.isBlank()다른 사람들이 이미 제안한 (또는 str -> !str.isBlank()술어) 선호하는 것처럼 str.trim()위에서 언급 한 접근법 의보다 현대적이고 효율적인 버전은 null 을 "공백"으로 str.strip()간주 하여 사용하는 것입니다 .

if (str != null && str.strip().length() > 0) {...}

예를 들어 단위 테스트와 같이 스트림과 함께 사용하기위한 Predicate로 예를 들면 다음과 같습니다.

@Test
public void anyNonEmptyStrippedTest() {
    String[] strings = null;
    Predicate<String> isNonEmptyStripped = str -> str != null && str.strip().length() > 0;
    assertTrue(Optional.ofNullable(strings).map(arr -> Stream.of(arr).noneMatch(isNonEmptyStripped)).orElse(true));
    strings = new String[] { null, "", " ", "\\n", "\\t", "\\r" };
    assertTrue(Optional.ofNullable(strings).map(arr -> Stream.of(arr).anyMatch(isNonEmptyStripped)).orElse(true));
    strings = new String[] { null, "", " ", "\\n", "\\t", "\\r", "test" };
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.