如何检查 Java 字符串是否全是空格?

我想检查 Java 字符串或字符数组不只是由空格组成,使用 Java?

这是一个非常类似的问题,除了它是 Javascript:
如何检查字符串是否包含字符和空格,而不仅仅是空格?

编辑 : 我删除了关于字母数字字符的内容,因此它更有意义。

200040 次浏览

我能想到的最简单的解决办法是:

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

这只检查(非)空白。如果您想检查特定的字符类,您需要使用强大的 match()和 regexp,比如:

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

... 检查至少一个(ASCII)字母数字字符。

修剪的方法应该对你很有效。

Http://download.oracle.com/docs/cd/e17476_01/javase/1.4.2/docs/api/java/lang/string.html#trim

返回字符串的副本 前导和尾随空格 如果该 String 对象 表示一个空字符 序列,或者第一个和最后一个 字符序列字符 表示的字符串对象 代码大于’u0020’( 空格字符) ,然后引用 返回此 String 对象。

否则,如果没有字符 密码大于 u0020 然后是一个新的 String 对象 表示空字符串的 创建并返回。

否则,设 k 为 字符串中的第一个字符 代码大于“ u0020”,并且让 M 是最后一个字符的索引 其代码更大的字符串中 一个新的 String 对象是 的子字符串 开头的字符串 索引 k 处的字符,并以 索引 m 处的字符-即 Substring (k,m + 1)的结果。

这种方法可以用来修剪 从开始到结束的空格 指一根绳子; 事实上,它修剪了所有 ASCII 控制字符也是如此。

返回: 此字符串的副本 前导和后导空白 如果没有,则删除此字符串 引导或拖曳的空白。

您可以修剪,然后比较一个空字符串,或者可能检查长度为0。

我会使用 Apache Commons Lang 图书馆。它有一个名为 StringUtils 的类,对各种字符串运算都很有用。为了检查 String 是否不全是空格,可以使用以下内容:

StringUtils.isBlank(<your string>)

这是参考资料: StringUtils.isBlank

这个答案更侧重于旁注“ 例如,至少有一个字母数字字符”。除此之外,它不会给其他(早期)解决方案添加太多内容,只是在 String 为 null的情况下,使用 NPE 不会对您造成损害。

如果(1) s 是 null,或者(2) s 是空的,或者(3) s 只包含白线查尔,我们需要 false

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

选择:

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

比 Carl Smotricz 提到的要短一些:

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

注意反斜杠 cap-S 的使用,意思是“非空白字符”

我敢打赌这是最简单(也许是最快的?)的解决方案。

如果您只检查空格而不关心 null,那么可以使用 org.apache.comms.lang. StringUtils.isWhitespace (String str) ,

StringUtils.isWhitespace(String str);

(检查 String 是否只包含空格。)

如果您还想检查 null (包括空格) ,那么

StringUtils.isBlank(String str);

饰()和其他提到的正则表达式不适用于所有类型的空白

即: Unicode字符线路分离器

Java 函数 Charter.isWhitespace ()涵盖所有情况。

这就是为什么已经提到了解决方案 IsWhitespace (String) < strong >/或 StringUtils.isBlank (String) 应该使用。

如果您使用的是 爪哇11或更新的 isBlank字符串方法,那么这个新的 isBlank字符串方法将派上用场:

!s.isBlank();

如果您使用的是 Java8、9或10,那么您可以构建一个简单的流来检查字符串是否不仅仅是空格:

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

除了不需要任何第三方库(如 Apache Commons Lang)之外,这些解决方案还具有处理任何空白字符的优势,而不像许多其他解决方案中建议的基于 trim的解决方案那样只需要简单的 ' '空间。您可以参考 Javadocs获得所有支持的空白类型的详尽列表。注意,在这两种情况下也包含空字符串。

使用 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()
StringUtils.isEmptyOrWhitespaceOnly(<your string>)

将检查: 是无效的吗 只有太空 是空字符串吗

Https://www.programcreek.com/java-api-examples/?class=com.mysql.jdbc

只是对 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 循环还要快..。

编辑: 文本越长,数字差异越大。修剪长文本比简单的循环需要更长的时间。然而,正则表达式仍然是最慢的解决方案。

就我个人而言,我更喜欢 !str.isBlank(),正如其他人已经建议的(或者 str -> !str.isBlank()作为谓词) ,上面提到的 str.trim()方法的一个更加现代和有效的版本,将使用 str.strip()-考虑到 无效作为“空格”:

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

例如,谓词,用于流,例如在单元测试中:

@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" };
}
public static boolean isStringBlank(final CharSequence cs) {
int strLen;
if (cs == null || (strLen = cs.length()) == 0) {
return true;
}
for (int i = 0; i < strLen; i++) {
if (!Character.isWhitespace(cs.charAt(i))) {
return false;
}
}
return true;
}