Как проверить, является ли строка пустой с помощью регулярных выражений


154

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

Случай;

"    some"   // not blank
"   " //blank
"" // blank

Здесь Бланк означает, что вы имеете в виду. Строка содержит полный пробел или строка не содержит ничего. Если вы хотите сопоставить строку, которая ничего не содержит, используйте '/ ^ $ /'
Badri Gs

Ответы:


329

Шаблон, который вы хотите, выглядит примерно так в многострочном режиме:

^\s*$

Объяснение:

  • ^ это начало якоря строки.
  • $ конец якоря строки
  • \s класс пробельных символов
  • * ноль или более повторений.

В многострочном режиме, ^а $также сопоставить начало и конец строки.

Ссылки:


Альтернатива без регулярных выражений:

Вы также можете проверить, является ли данная строка line«пустой» (т. Е. Содержащей только пробелы), путем trim()ее включения, а затем проверяя, является ли полученная строка isEmpty().

В Java это будет примерно так:

if (line.trim().isEmpty()) {
    // line is "blank"
}

Решение regex также может быть упрощено без привязок (из-за того, как matchesоно определено в Java) следующим образом:

if (line.matches("\\s*")) {
    // line is "blank"
}

Ссылки на API

  • String String.trim()
    • Возвращает копию строки, пропуская начальные и конечные пробелы.
  • boolean String.isEmpty()
    • Возвращает, trueесли и только если length()есть 0.
  • boolean String.matches(String regex)
    • Сообщает, соответствует ли эта (вся) строка заданному регулярному выражению.

1
@Adnan: обратите внимание на комментарий Барта в ответе Марсело; в зависимости от того, как вы хотите обрабатывать несколько пустых строк, шаблон может немного измениться.
полигенасмазочные материалы

Ну, я читаю файл из Java, строка за строкой, поэтому я предполагаю, что это будет хорошо.
Аднан

1
это кажется блестящим с line.trim: D
Аднан

1
отлично коды теперь выполняются от 1.6сек до> 1сек Спасибо.
Аднан

в Python: if line.strip(): так как пустая строка оценивается вFalse
Джон Марк

58

На самом деле в многострочном режиме более правильный ответ таков:

/((\r\n|\n|\r)$)|(^(\r\n|\n|\r))|^\s*$/gm

Принятый ответ: ^\s*$не соответствует сценарию, когда последняя строка пуста (в многострочном режиме).


Точно, и я подтвердил, что это так. Принятый ответ пропустил много пустых строк в моем файле, но это застало их всех. Объединение обоих регулярных выражений ловит каждый случай.
Элмор

1
Этот ответ отлично работал в таком инструменте, как Notepad ++. Принятый ответ совпал с несколькими пустыми строками, но не с единственными пустыми строками.
Джеймс

В моем случае принятый ответ не работает в Sublime Text 3, и это работает.
Янсибай

1
Принятый ответ сработал для моего случая, multilines. Это делает.
Роберт Габриэль

1
это должен быть лучший ответ.
Q i

12

Попробуй это:

^\s*$

5
@Adnan, обратите внимание, что это \sтакже соответствует разрывам строк, поэтому вы не сможете "найти" отдельные пустые строки внутри строки, содержащей последовательные пустые строки.
Барт Киерс

6

Самое портативное регулярное выражение будет ^[ \t\n]*$соответствовать пустой строке (обратите внимание , что вы должны заменить \tи \nс вкладкой и новой строкой соответственно) и [^ \n\t]в соответствии строку непробельной.


Я бы по крайней мере изменил единое пространство с классом[ \t]
Барт Киерс

1
В Windows также необходимо учитывать символ возврата каретки, \rчтобы регулярное выражение было ^[ \t\r\n]*$. Но ^\s*$лучше - более лаконично. Если вы не хотите сопоставлять символы новой строки, вы можете использовать \h(имеется в виду горизонтальный пробел), как в^\h*$
ps.pf

5

Полная благодарность bchr02 за этот ответ . Однако мне пришлось немного его изменить, чтобы поймать сценарий для строк, за которыми */(конец комментария) следует пустая строка. Регулярное выражение соответствовало непустой строке с */.

Новое: (^(\r\n|\n|\r)$)|(^(\r\n|\n|\r))|^\s*$/gm

Все, что я сделал, это добавил ^второй символ для обозначения начала строки.


Почему бы не прокомментировать ответ bchr02 и не предложить усовершенствование его ответа?
adamlogan

1
@adamlogan Да, по памяти, я думаю, что хотел сделать это в то время, но у меня не было достаточно репутации, чтобы комментировать чужой пост, поэтому пришлось сделать это вот так.
Джон Генри

3

Здесь Бланк означает, что вы имеете в виду.
Строка содержит полный пробел или строка не содержит ничего.
Если вы хотите сопоставить строку, которая ничего не содержит, используйте '/ ^ $ /'.


-1

Ну ... я возился (используя notepadd ++), и это решение я нашел

\ N \ s

\ n для конца строки (где вы начинаете сопоставление) - в моем случае каретка не помогла бы, так как начало строки является строкой \ s занимает любой пробел до следующей строки

Надеюсь, поможет


OP хочет получить регулярное выражение, а не символы новой строки.
Moody_Mudskipper

пользователь запрашивает «простое регулярное выражение, которое будет проверять, является ли строка пустой», это регулярное выражение (протестировано на regexpal.com) делает именно это. почему бы тебе не проверить это?
M_TRONIC

с помощью R, наш тестовый вектор: test_vec <- c(" some"," ",""). Ваше решение: grepl("\\n\\s",test_vec) # [1] FALSE FALSE FALSEГолосованное решение grepl("^\\s*$",test_vec) # [1] FALSE TRUE TRUE. Решение с голосованием дает ожидаемый результат, а ваше - нет.
Moody_Mudskipper

как я уже сказал, я использовал это в блокноте ++, и это сработало. твой не сделал. так что я думаю, мы можем согласиться не согласиться!
M_TRONIC

Я не совсем уверен, что вы делаете, вы делаете ctrl+fв notepad ++? В этом случае вы можете найти (хотя и не совсем совпадают) пустые строки, выбрав «Расширенный» режим поиска и выполнив поиск «\ n \ s», если вы выберете «Регулярное выражение», ваша строка будет совпадать, и вы можете также попробуйте решение @polygenelubricants. Последнее действительно будет соответствовать линии, вы можете проверить и увидеть разницу. Я бы посоветовал вам отредактировать свой ответ, чтобы быть более четким в отношении того, что вы советуете, чтобы читатели могли получить больше пользы от это.
Moody_Mudskipper
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.