Пустая строка ""
- это строка. Это не 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]|^$")
.
Возможно, путаница заключается в том, что matches
в Java должен соответствовать всей строке (то есть, как если бы вы окружили весь шаблон ^
и $
), так что вы можете отбросить якоря для matches
, но вам это понадобится, скажем, find
. Правильное регулярное выражение для таких методов будет тогда "^\\s*$"
, с явно включенными якорями.
Ниже приводится выдержка из первоначального ответа Клетуса (который теперь удален):
Pattern p = Pattern.compile("^\\s*$", Pattern.MULTILINE);
Matcher m = p.matcher(fileString);
while (m.find()) {
...
}
Pattern.MULTILINE
позволяет ^
и $
также соответствовать терминаторам строки в пределах fileString
.