Java를 사용하여 Java String 또는 문자 배열이 공백으로 구성된 것이 아닌지 확인하고 싶습니까?
이것은 자바 스크립트를 제외하고는 매우 비슷한 질문입니다.
문자열에 공백뿐만 아니라 문자 및 공백이 포함되어 있는지 어떻게 확인할 수 있습니까?
편집 : 영숫자 문자에 대한 비트를 제거 했으므로 더 의미가 있습니다.
String.isBlank
API를 사용할 수 있습니다 .
Java를 사용하여 Java String 또는 문자 배열이 공백으로 구성된 것이 아닌지 확인하고 싶습니까?
이것은 자바 스크립트를 제외하고는 매우 비슷한 질문입니다.
문자열에 공백뿐만 아니라 문자 및 공백이 포함되어 있는지 어떻게 확인할 수 있습니까?
편집 : 영숫자 문자에 대한 비트를 제거 했으므로 더 의미가 있습니다.
String.isBlank
API를 사용할 수 있습니다 .
답변:
내가 생각할 수있는 가장 짧은 해결책 :
if (string.trim().length() > 0) ...
공백 만 검사합니다. 특정 문자 클래스를 확인하려면 다음 match()
과 같은 정규 표현식 을 사용하십시오 .
if (string.matches(".*\\w.*")) ...
... 적어도 하나 이상의 (ASCII) 영숫자를 확인합니다.
matches()
: 성능을 위해, 나는 일반적으로 저장 Pattern
A의 final static
. 동일한 코드가 자주 실행되면 돈을 지불합니다.
null
문자열이 아닙니다! "
Apache Commons Lang 라이브러리를 사용합니다. 여기에는 모든 종류의 문자열 작업에 유용한 StringUtils라는 클래스가 있습니다. 문자열이 모든 공백이 아닌지 확인하려면 다음을 사용할 수 있습니다.
StringUtils.isBlank(<your string>)
참조는 다음과 같습니다. StringUtils.isBlank
StringUtils.isEmpty
""을 (를) 전달하면 false가 반환됩니다.
Java 11을 사용하는 경우 새 isBlank
문자열 메소드가 유용합니다.
!s.isBlank();
당신이 사용하는 경우 자바 8, 9 또는 10을 , 당신은 문자열이 공백뿐만 아니라 있는지 확인하는 간단한 스트림을 만들 수있다 :
!s.chars().allMatch(Character::isWhitespace));
Apache Commons Lang과 같은 타사 라이브러리가 필요하지 않은 것 외에도 이러한 솔루션은 다른 많은 답변에서 제안 된 기반 솔루션 ' '
과 같이 일반 공백 뿐만 아니라 공백 문자를 처리 할 수 있다는 이점이 trim
있습니다. 지원되는 모든 공백 유형의 전체 목록은 Javadoc 을 참조하십시오 . 빈 문자열도 두 경우 모두 적용됩니다.
if(target.matches("\\S"))
// then string contains at least one non-whitespace character
"비 공백 문자"를 의미하는 백 슬래시 cap-S 사용 참고
가장 간단한 솔루션 일 것입니다.
String year="1995"; year.matches("\\S"); will return false
그래서 이것은 올바른 해결책이 아닙니다. : |
이 답변 은 " 즉, 적어도 하나의 영숫자 문자가 있습니다 "라는 주석에 더 중점을 둡니다 . 그 외에도 String이 인 경우 NPE로 당신을 해치지 않는 것을 제외하고는 다른 (이전) 솔루션에 너무 많이 추가되지 않습니다 null
.
우리는 원하는 false
(1) 일이야 경우 null
또는 (2)의이 비어 있거나 (3) 만 whitechars를 포함이야.
public static boolean containsNonWhitespaceChar(String s) {
return !((s == null) || "".equals(s.trim()));
}
공백 만 확인하고 null을 신경 쓰지 않으면 org.apache.commons.lang.StringUtils.isWhitespace (String str)를 사용할 수 있습니다.
StringUtils.isWhitespace(String str);
(문자열에 공백 만 포함되어 있는지 확인합니다.)
null (공백 포함)도 확인하려면
StringUtils.isBlank(String str);
Java-11 +에서는 String.isBlank
API를 사용 하여 주어진 문자열이 모두 공백으로 구성되어 있지 않은지 확인할 수 있습니다.
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()
트림 방법은 당신에게 잘 작동합니다.
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인지 확인할 수 있습니다.
대안 :
boolean isWhiteSpaces( String s ) {
return s != null && s.matches("\\s+");
}
trim () 및 다른 언급 된 정규식은 모든 유형의 공백에 대해 작동하지 않습니다
예 : 유니 코드 문자 'LINE SEPARATOR' http://www.fileformat.info/info/unicode/char/2028/index.htm
Java 함수 Character.isWhitespace ()는 모든 상황을 다룹니다.
그렇기 때문에 이미 언급 한 솔루션 StringUtils.isWhitespace (String) / 또는 StringUtils.isBlank (String)을 사용해야합니다.
StringUtils.isEmptyOrWhitespaceOnly(<your string>)
확인합니다 :-그것은 null입니까-공간 만입니까-빈 문자열 ""
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는 여전히 빠릅니다 ...
편집 : 텍스트가 길수록 숫자가 다릅니다. 긴 텍스트 자르기는 단순한 루프보다 시간이 오래 걸립니다. 그러나 정규식은 여전히 가장 느린 솔루션입니다.
개인적으로 나는 !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" };
}