Java - 正则表达式。档案问题

时间:2010-04-17 05:10:09

标签: java regex

我从文本文件中抓取线条并使用正则表达式逐行筛选。我正在尝试搜索空白行,没有任何意义或只是空格。

然而,究竟什么是空的空间?我知道空白是\ s但是什么是一条什么都没有的线? null(\ 0)?换行(\ n)?

我尝试了Java教程中的测试工具来尝试测试,看看到底有多空,但到目前为止还没有运气。

2 个答案:

答案 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