Ява - Рег. Ex. Файл Вопрос - PullRequest
0 голосов
/ 17 апреля 2010

Я беру строки из текстового файла и просеиваю построчно, используя регулярные выражения. Я пытаюсь найти пустые строки, ничего не значащие или просто пропуски.

Но что же такое пустое пространство? Я знаю, что пробел - это \ s, но что такое строка, которая вообще ничего не значит? ноль (\ 0)? перевод строки (\ n)?

Я попробовал использовать тестовую систему в руководстве по Java, чтобы попытаться проверить, что такое пустое пространство, но пока не повезло.

Ответы [ 2 ]

4 голосов
/ 17 апреля 2010

Пустая строка "" - это строка. Это не 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.

1 голос
/ 17 апреля 2010

Я обычно использую Apache Commons StringUtils -класса.У него есть хорошие 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...