Я пытаюсь сделать простое регулярное выражение, которое будет проверять, является ли строка пустой или нет.
Случай;
" some" // not blank
" " //blank
"" // blank
Я пытаюсь сделать простое регулярное выражение, которое будет проверять, является ли строка пустой или нет.
Случай;
" some" // not blank
" " //blank
"" // blank
Ответы:
Шаблон, который вы хотите, выглядит примерно так в многострочном режиме:
^\s*$
Объяснение:
^
это начало якоря строки.$
конец якоря строки\s
класс пробельных символов*
ноль или более повторений.В многострочном режиме, ^
а $
также сопоставить начало и конец строки.
Вы также можете проверить, является ли данная строка line
«пустой» (т. Е. Содержащей только пробелы), путем trim()
ее включения, а затем проверяя, является ли полученная строка isEmpty()
.
В Java это будет примерно так:
if (line.trim().isEmpty()) {
// line is "blank"
}
Решение regex также может быть упрощено без привязок (из-за того, как matches
оно определено в Java) следующим образом:
if (line.matches("\\s*")) {
// line is "blank"
}
String String.trim()
boolean String.isEmpty()
true
если и только если length()
есть 0
.boolean String.matches(String regex)
if line.strip():
так как пустая строка оценивается вFalse
На самом деле в многострочном режиме более правильный ответ таков:
/((\r\n|\n|\r)$)|(^(\r\n|\n|\r))|^\s*$/gm
Принятый ответ: ^\s*$
не соответствует сценарию, когда последняя строка пуста (в многострочном режиме).
Попробуй это:
^\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. Последнее действительно будет соответствовать линии, вы можете проверить и увидеть разницу. Я бы посоветовал вам отредактировать свой ответ, чтобы быть более четким в отношении того, что вы советуете, чтобы читатели могли получить больше пользы от это.