[英]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>)
将检查: - 是否为空 - 是否只有空格 - 是否为空字符串“”
虽然我个人更喜欢!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.