我从文本文件中抓取线条并使用正则表达式逐行筛选。我正在尝试搜索空白行,没有任何意义或只是空格。
然而,究竟什么是空的空间?我知道空白是\ s但是什么是一条什么都没有的线? null(\ 0)?换行(\ n)?
我尝试了Java教程中的测试工具来尝试测试,看看到底有多空,但到目前为止还没有运气。
答案 0 :(得分:4)
空字符串""
是一个字符串。这不是null
。它没有任何字符,甚至没有\0
(这只是Java中的一个字符,即它不是字符串终止符(JLS 10.9))。
以下都是真的:
"" != null
"" instanceof String
"".contains("")
以下是专门用于空字符串:
"".matches("")
"".matches("^$")
"".length() == 0
"".isEmpty()
对于空字符串以及仅包含空格的所有其他字符串也是如此:
"".matches("\\s*");
这是因为*
是模式的零重复或更多重复。零重复的空格是一个空字符串。
以下所有仅包含空格的字符串也是如此:
s.trim().isEmpty()
我注意到
\s*
检测到一个或多个空格。如何使它只检测空格?例如"test test"
无效?
\s*
匹配零或更多空格,"test test".matches("\\s*")
为false
。
然而, find
\s*
"test test"
,就像你在任何字符串中找到一样,因为\s*
可以匹配空字符串,所有字符串contains("")
。
想出来......
^\s*[^a-zA-Z0-9\W]|^$
[^a-zA-Z0-9\W]
实际上没有任何意义,事实上"_".matches("^\\s*[^a-zA-Z0-9\\W]|^$")
。
也许令人困惑的是,因为Java中的matches
需要匹配整个字符串(即好像你用^
和{{1}包围了整个模式}),所以你可以删除$
的锚点,但你需要它,比如matches
。这些方法的正确正则表达式为find
,并明确包含锚点。
以下是cletus原始答案的摘录(现已删除):
"^\\s*$"
Pattern p = Pattern.compile("^\\s*$", Pattern.MULTILINE);
Matcher m = p.matcher(fileString);
while (m.find()) {
...
}
允许Pattern.MULTILINE
和^
也匹配$
中的行终结符。
答案 1 :(得分:1)
我通常使用Apache Commons StringUtils -class。它有很好的isEmpty()
和isBlank()
方法,可以很好地处理null:
Checks if a String is empty ("") or null.
StringUtils.isEmpty(null) = true
StringUtils.isEmpty("") = true
StringUtils.isEmpty(" ") = false
StringUtils.isEmpty("bob") = false
StringUtils.isEmpty(" bob ") = false
Checks if a String is whitespace, empty ("") or null.
StringUtils.isBlank(null) = true
StringUtils.isBlank("") = true
StringUtils.isBlank(" ") = true
StringUtils.isBlank("bob") = false
StringUtils.isBlank(" bob ") = false