如何检查 Java 字符串是不是全是空格?
Posted
技术标签:
【中文标题】如何检查 Java 字符串是不是全是空格?【英文标题】:How do I check that a Java String is not all whitespaces?如何检查 Java 字符串是否全是空格? 【发布时间】:2011-03-15 21:27:30 【问题描述】:我想检查 Java 字符串或字符数组是否不只是由空格组成,使用 Java?
这是一个非常相似的问题,除了它是 javascript:How can I check if string contains characters & whitespace, not just whitespace?
编辑:我删除了关于字母数字字符的部分,所以它更有意义。
【问题讨论】:
请注意,空白有许多不同的定义:spreadsheets.google.com/pub?key=pd8dAQyHbdewRsnE5x5GzKQ 你想要哪个?或者然后你说“有一个字母数字字符”,这是完全不同的事情。请澄清。 为混乱道歉......不是所有的空格都是关键 - 基本上如果它有所有的空格字符我想排除它,因为它没有内容。 使用 JDK/11 你可以make use of theString.isBlank
API 实现同样的目的。
【参考方案1】:
我能想到的最短解决方案:
if (string.trim().length() > 0) ...
这仅检查(非)空白。如果你想检查特定的字符类,你需要使用强大的match()
和一个正则表达式,例如:
if (string.matches(".*\\w.*")) ...
...检查至少一个 (ASCII) 字母数字字符。
【讨论】:
FWIW:我希望第一个解决方案会快得多。 @Stephen C:当然!但正如@Uri 指出的那样,由于问题的模糊性,我不得不解决两个不同的问题:) 另外,我很少使用matches()
:为了提高性能,我通常将Pattern
存储在final static
中。如果相同的代码经常运行,就会得到回报。
@Andreas_D:嘿,我收到了订单! OP 说他想检查一个字符串或字符数组,他从来没有说过任何关于空值的事情! :) *检查合同中的细则*“null
不是字符串!”
另外,"\\w" 仅匹配有限的非空白字符子集,而不是所有非空白字符,因为它指的是定义为 AZ、az、0-9 和下划线。
我使用了 your_string.trim().isEmpty() 并为我完成了这项工作【参考方案2】:
StringUtils.isBlank(CharSequence)
https://commons.apache.org/proper/commons-lang/javadocs/api-release/org/apache/commons/lang3/StringUtils.html#isBlank-java.lang.CharSequence-
【讨论】:
嗯,我的编译器无法识别 StringUtils 中的这个方法。【参考方案3】:trim 方法应该很适合你。
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 |很抱歉,该页面不存在或不再可用。【参考方案4】:我会使用 Apache Commons Lang 库。它有一个名为 StringUtils 的类,可用于各种字符串操作。要检查字符串是否不都是空格,可以使用以下命令:
StringUtils.isBlank(<your string>)
这是参考:StringUtils.isBlank
【讨论】:
与使用所选答案相比,我更喜欢此解决方案。这还将检查 string == null 这现在是不正确的。如果你传入 " ",StringUtils.isEmpty
现在将返回 false。【参考方案5】:
此答案更多地关注旁注“即至少有一个字母数字字符”。除此之外,它不会对其他(早期)解决方案增加太多,除非它不会在字符串为null
的情况下对您造成伤害。
如果 (1) s 是 null
或 (2) s 为空或 (3) s 仅包含白字符,我们想要 false
。
public static boolean containsNonWhitespaceChar(String s)
return !((s == null) || "".equals(s.trim()));
【讨论】:
【参考方案6】:替代方案:
boolean isWhiteSpaces( String s )
return s != null && s.matches("\\s+");
【讨论】:
\\s* 将匹配所有带或不带空格的字符串。也许你的意思是 \\s+ ?【参考方案7】:比 Carl Smotricz 提到的略短:
!string.trim().isEmpty();
【讨论】:
你们这些年轻的捕食者和你们新奇的后 Java-1.6 诡计!说真的,我公司至少有一个项目仍然在 Java 1.4 上运行(叹气)。 更短?是的。就个人而言,我喜欢更冗长的编码风格【参考方案8】:if(target.matches("\\S"))
// then string contains at least one non-whitespace character
注意使用反斜杠 cap-S,意思是“非空白字符”
我敢打赌这是最简单(也许是最快?)的解决方案。
【讨论】:
让我们试试:String year="1995"; year.matches("\\S"); will return false
所以这不是正确的解决方案。 :|
Nhat,你是对的,虽然我不知道为什么。根据 Java 文档, String.matches 检查给定字符串是否与正则表达式匹配。一个小实验表明这并不完全准确,因为这个函数似乎只有在提供的正则表达式匹配整个字符串时才匹配!因此,将上面的正则表达式 ("\\S") 更改为 "^.*\\S.*$" 将按预期工作,尽管此行为没有正确记录,并且似乎与字符串匹配的所有其他实现大相径庭使用正则表达式。【参考方案9】:
如果你只检查空格而不关心 null 那么你可以使用 org.apache.commons.lang.StringUtils.isWhitespace(String str),
StringUtils.isWhitespace(String str);
(检查字符串是否只包含空格。)
如果您还想检查 null(包括空格),那么
StringUtils.isBlank(String str);
【讨论】:
isBlank(String) 被推荐,因为它也处理空验证!【参考方案10】:trim() 和其他提到的正则表达式不适用于所有类型的空格
即:Unicode 字符“行分隔符”http://www.fileformat.info/info/unicode/char/2028/index.htm
Java 函数 Character.isWhitespace() 涵盖所有情况。
这就是为什么已经提到的解决方案 StringUtils.isWhitespace(String) /或 StringUtils.isBlank(String) 应该使用。
【讨论】:
【参考方案11】:如果您使用的是 Java 11 或更新版本,新的isBlank
字符串方法将派上用场:
!s.isBlank();
如果您使用的是 Java 8、9 或 10,您可以构建一个简单的流来检查字符串是否仅是空白:
!s.chars().allMatch(Character::isWhitespace));
除了不需要任何第三方库(例如 Apache Commons Lang)之外,这些解决方案还具有处理任何空白字符的优势,而不仅仅是简单的 ' '
空格,如基于 trim
的解决方案许多其他答案。您可以参考Javadocs 以获取所有支持的空白类型的详尽列表。请注意,在这两种情况下也包括空字符串。
【讨论】:
【参考方案12】:使用 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()
【讨论】:
【参考方案13】:StringUtils.isEmptyOrWhitespaceOnly(<your string>)
将检查: - 是否为空 - 只有空间吗? - 是否为空字符串“”
https://www.programcreek.com/java-api-examples/?class=com.mysql.jdbc.StringUtils&method=isEmptyOrWhitespaceOnly
【讨论】:
这是来自图书馆吗?链接到项目。还是内置在 Java 中?注明包装。 @BasilBourque 我认为这是 com.mysql.jdbc.StringUtils.isEmptyOrWhitespaceOnly【参考方案14】:只是在 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 循环还要快...
编辑: 文本越长,不同的数字就越多。长文本的修剪比简单的循环需要更长的时间。但是,正则表达式仍然是最慢的解决方案。
【讨论】:
【参考方案15】:虽然我个人更喜欢!str.isBlank()
,正如其他人已经建议的那样(或str -> !str.isBlank()
作为谓词),但上述str.trim()
方法的更现代和更有效的版本将使用str.strip()
- 考虑到nulls 作为“空白”:
if (str != null && str.strip().length() > 0) ...
例如作为谓词,用于流,例如。 G。在单元测试中:
@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" ;
【讨论】:
【参考方案16】: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;
【讨论】:
以上是关于如何检查 Java 字符串是不是全是空格?的主要内容,如果未能解决你的问题,请参考以下文章