如何检查Java字符串是否不是所有空格?


132

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

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

编辑:我删除了有关字母数字字符的位,所以更有意义。


3
请注意,空白有许多不同的定义:sheets.google.com/pub ?key = pd8dAQyHbdewRsnE5x5GzKQ您想要哪个?或者,然后您说“具有字母数字字符”,这是完全不同的事情。请澄清。
凯文·布罗里恩

造成困惑的道歉...并不是所有的空格都是关键-基本上,如果它具有我要排除的所有空格字符,因为它没有内容。
ANKUR

1
使用JDK / 11,您可以使用String.isBlank相同 API。
纳曼

Answers:


224

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

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

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

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

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


9
FWIW:我希望第一个解决方案会更快。
斯蒂芬·C

2
@Stephen C:绝对!但是正如@Uri所指出的,由于问题的含糊不清,我不得不解决两个不同的问题:)另外,我很少使用matches():出于性能考虑,我通常将它们存储在Patternfinal static。如果相同的代码频繁运行,将有回报。
卡尔·斯莫特里奇

3
@Andreas_D:嘿,我接到命令了!OP说他想检查一个字符串或char数组,他从没说过空值!:) *检查合同中的细则*“ null不是字符串!”
卡尔·斯莫特里奇

1
另外,“ \\ w”仅匹配非空白字符的有限子集,而不匹配所有非空白字符,因为它指的是定义为AZ,az,0-9和下划线的“单词字符”。
罗布·赖斯

2
我使用了your_string.trim()。isEmpty()并为我完成了这项工作
Neri

59

我将使用Apache Commons Lang库。它具有一个称为StringUtils的类,可用于各种String操作。要检查字符串是否不是所有空格,可以使用以下命令:

StringUtils.isBlank(<your string>)

这里是参考:StringUtils.isBlank


8
与使用所选答案相比,我更喜欢这种解决方案。这还将检查字符串== null
理查德(Richard)2010年

现在这是不正确的。StringUtils.isEmpty现在,如果您输入“”,则将返回false。
James Spence

53

比Carl Smotricz提到的略短:

!string.trim().isEmpty();

10
您是年轻的胡言乱语者,还是您新来的Java-1.6之后的骗局!认真地说,我公司中至少有一个项目仍在Java 1.4上运行(叹气)。
卡尔·斯莫特里奇

更短?是。就我个人而言,我喜欢更冗长的编码风格
Michel


9

如果您使用的是Java 11,那么新的isBlank字符串方法将派上用场:

!s.isBlank();

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

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

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


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,2015年

6
没什么,您是正确的,尽管我很茫然地解释原因。根据Java文档,String.matches检查以查看给定的字符串是否与正则表达式匹配。一个小的实验表明这并不完全准确,因为仅当提供的正则表达式与ENTIRE字符串匹配时,此函数才看起来匹配!因此,将上面的正则表达式(“ \\ S”)更改为“ ^。* \\ S。* $”将按预期工作,尽管此行为未得到正确记录,并且似乎与字符串匹配的其他所有实现都大相径庭使用正则表达式。
罗布·赖斯

4

该答案更多地侧注于注解“ 即具有至少一个字母数字字符 ”。除此之外,它不会对其他(较早的)解决方案增加太多,除了在String为的情况下使用NPE不会损害您null

我们想要false(1)s是null或(2)s为空,或者(3)s只包含白字符。

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对象。

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

该方法可用于从字符串的开头和结尾修剪空格;实际上,它也会修剪所有ASCII控制字符。

返回:除去前导和尾随空格的此字符串的副本;如果没有前导或尾随空格,则返回此字符串。前导或尾随空格。

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


答案中的链接已消失-404 | 很抱歉,该页面不存在或不再可用


0

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

即:Unicode字符“ LINE SEPARATOR” http://www.fileformat.info/info/unicode/char/2028/index.htm

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

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



0

只是在Windows 10的openjdk 13上的性能比较。对于每种泰语文本:

"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循环更快地查找一个非空白字符...

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


0

!str.isBlank()正如其他人已经建议的那样(或str -> !str.isBlank()作为谓词),我个人更str.trim()希望使用上述方法的一种更现代,更有效的版本,并且会使用str.strip()-将null视为“空白”:

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" };
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.