Здесь Бланк означает, что вы имеете в виду. Строка содержит полный пробел или строка не содержит ничего. Если вы хотите сопоставить строку, которая ничего не содержит, используйте '/ ^ $ /'
Badri Gs
Ответы:
329
Шаблон, который вы хотите, выглядит примерно так в многострочном режиме:
^\s*$
Объяснение:
^ это начало якоря строки.
$ конец якоря строки
\s класс пробельных символов
* ноль или более повторений.
В многострочном режиме, ^а $также сопоставить начало и конец строки.
Вы также можете проверить, является ли данная строка line«пустой» (т. Е. Содержащей только пробелы), путем trim()ее включения, а затем проверяя, является ли полученная строка isEmpty().
В Java это будет примерно так:
if(line.trim().isEmpty()){// line is "blank"}
Решение regex также может быть упрощено без привязок (из-за того, как matchesоно определено в Java) следующим образом:
@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. Это делает.
@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
Здесь Бланк означает, что вы имеете в виду.
Строка содержит полный пробел или строка не содержит ничего.
Если вы хотите сопоставить строку, которая ничего не содержит, используйте '/ ^ $ /'.
Ну ... я возился (используя 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. Последнее действительно будет соответствовать линии, вы можете проверить и увидеть разницу. Я бы посоветовал вам отредактировать свой ответ, чтобы быть более четким в отношении того, что вы советуете, чтобы читатели могли получить больше пользы от это.
Ответы:
Шаблон, который вы хотите, выглядит примерно так в многострочном режиме:
Объяснение:
^
это начало якоря строки.$
конец якоря строки\s
класс пробельных символов*
ноль или более повторений.В многострочном режиме,
^
а$
также сопоставить начало и конец строки.Ссылки:
Альтернатива без регулярных выражений:
Вы также можете проверить, является ли данная строка
line
«пустой» (т. Е. Содержащей только пробелы), путемtrim()
ее включения, а затем проверяя, является ли полученная строкаisEmpty()
.В Java это будет примерно так:
Решение regex также может быть упрощено без привязок (из-за того, как
matches
оно определено в Java) следующим образом:Ссылки на API
String String.trim()
boolean String.isEmpty()
true
если и только еслиlength()
есть0
.boolean String.matches(String regex)
источник
if line.strip():
так как пустая строка оценивается вFalse
На самом деле в многострочном режиме более правильный ответ таков:
Принятый ответ:
^\s*$
не соответствует сценарию, когда последняя строка пуста (в многострочном режиме).источник
Попробуй это:
источник
\s
также соответствует разрывам строк, поэтому вы не сможете "найти" отдельные пустые строки внутри строки, содержащей последовательные пустые строки.Самое портативное регулярное выражение будет
^[ \t\n]*$
соответствовать пустой строке (обратите внимание , что вы должны заменить\t
и\n
с вкладкой и новой строкой соответственно) и[^ \n\t]
в соответствии строку непробельной.источник
[ \t]
\r
чтобы регулярное выражение было^[ \t\r\n]*$
. Но^\s*$
лучше - более лаконично. Если вы не хотите сопоставлять символы новой строки, вы можете использовать\h
(имеется в виду горизонтальный пробел), как в^\h*$
Полная благодарность bchr02 за этот ответ . Однако мне пришлось немного его изменить, чтобы поймать сценарий для строк, за которыми
*/
(конец комментария) следует пустая строка. Регулярное выражение соответствовало непустой строке с*/
.Новое:
(^(\r\n|\n|\r)$)|(^(\r\n|\n|\r))|^\s*$/gm
Все, что я сделал, это добавил
^
второй символ для обозначения начала строки.источник
Здесь Бланк означает, что вы имеете в виду.
Строка содержит полный пробел или строка не содержит ничего.
Если вы хотите сопоставить строку, которая ничего не содержит, используйте '/ ^ $ /'.
источник
Ну ... я возился (используя notepadd ++), и это решение я нашел
\ N \ s
\ n для конца строки (где вы начинаете сопоставление) - в моем случае каретка не помогла бы, так как начало строки является строкой \ s занимает любой пробел до следующей строки
Надеюсь, поможет
источник
test_vec <- c(" some"," ","")
. Ваше решение:grepl("\\n\\s",test_vec) # [1] FALSE FALSE FALSE
Голосованное решениеgrepl("^\\s*$",test_vec) # [1] FALSE TRUE TRUE
. Решение с голосованием дает ожидаемый результат, а ваше - нет.ctrl+f
в notepad ++? В этом случае вы можете найти (хотя и не совсем совпадают) пустые строки, выбрав «Расширенный» режим поиска и выполнив поиск «\ n \ s», если вы выберете «Регулярное выражение», ваша строка будет совпадать, и вы можете также попробуйте решение @polygenelubricants. Последнее действительно будет соответствовать линии, вы можете проверить и увидеть разницу. Я бы посоветовал вам отредактировать свой ответ, чтобы быть более четким в отношении того, что вы советуете, чтобы читатели могли получить больше пользы от это.