我想使用Java检查Java字符串或字符数组是否仅由空格组成?
这是一个非常相似的问题,只是使用了Javascript:
如何检查字符串是否包含字符和空格,而不仅仅是空格?
编辑:我删除了有关字母数字字符的位,所以更有意义。
String.isBlank
相同的 API。
我想使用Java检查Java字符串或字符数组是否仅由空格组成?
这是一个非常相似的问题,只是使用了Javascript:
如何检查字符串是否包含字符和空格,而不仅仅是空格?
编辑:我删除了有关字母数字字符的位,所以更有意义。
String.isBlank
相同的 API。
Answers:
我能想到的最短的解决方案:
if (string.trim().length() > 0) ...
这仅检查(非)空白。如果要检查特定的字符类,则需要使用强大match()
的正则表达式,例如:
if (string.matches(".*\\w.*")) ...
...检查至少一个(ASCII)字母数字字符。
matches()
:出于性能考虑,我通常将它们存储在Pattern
中final static
。如果相同的代码频繁运行,将有回报。
null
不是字符串!”
我将使用Apache Commons Lang库。它具有一个称为StringUtils的类,可用于各种String操作。要检查字符串是否不是所有空格,可以使用以下命令:
StringUtils.isBlank(<your string>)
这里是参考:StringUtils.isBlank
StringUtils.isEmpty
现在,如果您输入“”,则将返回false。
如果您使用的是Java 11,那么新的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 year="1995"; year.matches("\\S"); will return false
所以这不是正确的解决方案。:|
该答案更多地侧注于注解“ 即具有至少一个字母数字字符 ”。除此之外,它不会对其他(较早的)解决方案增加太多,除了在String为的情况下使用NPE不会损害您null
。
我们想要false
(1)s是null
或(2)s为空,或者(3)s只包含白字符。
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对象。
否则,令k为代码中大于“ \ u0020”的字符串中第一个字符的索引,而m为代码中大于“ \ u0020”的字符串中最后一个字符的索引。创建一个新的String对象,该对象表示该字符串的子字符串,该子字符串以索引k处的字符开始,并以索引m处的字符结束,即this.substring(k,m + 1)的结果。
该方法可用于从字符串的开头和结尾修剪空格;实际上,它也会修剪所有ASCII控制字符。
返回:除去前导和尾随空格的此字符串的副本;如果没有前导或尾随空格,则返回此字符串。前导或尾随空格。
您可以修剪,然后将其与空字符串进行比较,或者可以检查长度是否为0。
选择:
boolean isWhiteSpaces( String s ) {
return s != null && s.matches("\\s+");
}
trim()和其他提到的正则表达式不适用于所有类型的空白
即:Unicode字符“ 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>)
将会检查:-是否为空-是否只有空格-是否为空字符串“”
只是在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循环更快地查找一个非空白字符...
编辑: 文本越长,数字越多。修剪长文本比简单循环需要更长的时间。但是,正则表达式仍然是最慢的解决方案。
!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" };
}