繁体   English   中英

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

[英]How do I check that a Java String is not all whitespaces?

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

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

编辑:我删除了有关字母数字字符的部分,因此更有意义。

我能想到的最短解决方案:

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

这仅检查(非)空白。 如果要检查特定字符类,则需要使用强大的match()和正则表达式,例如:

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

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

我会使用 Apache Commons Lang 库。 它有一个名为 StringUtils 的类,可用于各种字符串操作。 要检查字符串是否全部为空格,您可以使用以下命令:

StringUtils.isBlank(<your string>)

这是参考: StringUtils.isBlank

比 Carl Smotricz 提到的略短:

!string.trim().isEmpty();

如果您使用的是Java 11或更新版本,新的isBlank字符串方法isBlank上用场:

!s.isBlank();

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

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

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

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

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

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

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

如果 (1) s 为null或 (2) s 为空或 (3) s 仅包含 whitechars,我们想要false

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

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

StringUtils.isWhitespace(String str);

(检查字符串是否仅包含空格。)

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

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()

只是在 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

令人惊讶的是,trim+empty 是最快的。 即使它需要构造修剪后的文本。 仍然比简单的 for 循环更快地寻找一个单一的非空白字符......

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

修剪方法应该对你很有用。

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

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

否则,如果字符串中没有代码大于 '\ ' 的字符,则创建并返回一个表示空字符串的新 String 对象。

否则,令 k 为代码大于 '\ ' 的字符串中第一个字符的索引,并令 m 为代码大于 '\ ' 的字符串中最后一个字符的索引。 创建一个新的 String 对象,表示这个字符串的子串,以索引 k 处的字符开始,以索引 m 处的字符结束——即 this.substring(k, m+1) 的结果。

此方法可用于从字符串的开头和结尾修剪空格; 事实上,它还修剪了所有 ASCII 控制字符。

返回: 此字符串的副本,其中删除了前导和尾随空格,或者此字符串,如果它没有前导或尾随空格。前导或尾随空格。

您可以修剪然后与空字符串进行比较,或者可能检查长度是否为 0。

选择:

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

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

即:Unicode 字符“行分隔符” http://www.fileformat.info/info/unicode/char/2028/index.htm

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

这就是为什么应该使用已经提到的解决方案StringUtils.isWhitespace( String ) / 或 StringUtils.isBlank(String) 的原因

StringUtils.isEmptyOrWhitespaceOnly(<your string>)

将检查: - 是否为空 - 是否只有空格 - 是否为空字符串“”

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

虽然我个人更喜欢!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;
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM