Como verificar se uma linha está em branco usando regex

154

Eu estou tentando fazer regex simples que irá verificar se uma linha está em branco ou não.

Caso;

"    some"   // not blank
"   " //blank
"" // blank
Adnan
fonte
Aqui em branco significa o que você está querendo dizer. Uma linha contém espaços em branco ou uma linha não contém nada. Se você quiser corresponder a uma linha que não contém nada, use '/ ^ $ /'
Badri Gs 4/17

Respostas:

329

O padrão que você deseja é mais ou menos assim no modo de múltiplas linhas:

^\s*$

Explicação:

  • ^ é o começo da âncora de cadeia.
  • $ é o fim da âncora de cadeia.
  • \s é a classe de caracteres de espaço em branco.
  • * é zero ou mais repetições de.

No modo multilinha, ^e $também corresponde ao início e ao fim da linha.

Referências:


Uma alternativa não regex:

Você também pode verificar se uma determinada string lineestá "em branco" (ou seja, contendo apenas espaços em branco), trim()pressionando-a e, em seguida, verificando se a string resultante isEmpty().

Em Java, isso seria algo como isto:

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

A solução regex também pode ser simplificada sem âncoras (por causa de como matchesé definido em Java) da seguinte maneira:

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

Referências de API

poligenelubricants
fonte
1
@Adnan: anote o comentário de Bart na resposta de Marcelo; dependendo de como você deseja lidar com várias linhas em branco, o padrão pode mudar um pouco.
polygenelubricants
Bem, eu estou lendo um arquivo de Java, linha por linha, então suponho que tudo ficará bem.
Adnan
1
Isso parece brilhante com line.trim: D
Adnan
1
excelente, os códigos agora são executados de 1.6s a 1s. Obrigado.
Adnan
em python: if line.strip(): uma vez que uma string vazia é avaliada comoFalse
John Mark
58

Na verdade, no modo multilinha, uma resposta mais correta é esta:

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

A resposta aceita: ^\s*$não corresponde a um cenário quando a última linha está em branco (no modo de múltiplas linhas).

bchr02
fonte
Exatamente, e confirmei que este é o caso. A resposta aceita perdeu muitas linhas vazias no meu arquivo, mas isso pegou todas. A união de ambas as expressões regulares captura todos os casos.
Elmor
1
Essa resposta funcionou perfeitamente em uma ferramenta como o Notepad ++. A resposta aceita corresponde a várias linhas vazias, mas não a uma única linha vazia.
james
No meu caso, a resposta aceita não funciona no Sublime Text 3, e isso funciona.
precisa saber é o seguinte
1
A resposta aceita funcionou para o meu caso, multilinhas. Isso faz.
Robert Gabriel
1
essa deve ser a melhor resposta.
Q i
12

Tente o seguinte:

^\s*$
Marcelo Cantos
fonte
5
@Adnan, observe que \stambém corresponde a quebras de linha, para que você não "encontre" linhas vazias únicas dentro de uma string contendo sucessivas linhas vazias.
Bart Kiers
6

O regex mais portátil seria ^[ \t\n]*$corresponder a uma sequência vazia (observe que você precisaria substituir \te \npor tab e newline adequadamente) e [^ \n\t]corresponder a uma sequência que não seja de espaço em branco.

soulmerge
fonte
Eu, pelo menos, alterar o espaço único com a classe[ \t]
Bart Kiers
1
No Windows, você também precisa considerar o caractere de retorno de carro \rpara que a regex seja ^[ \t\r\n]*$. Mas ^\s*$é melhor - mais conciso. Se você não deseja combinar novas linhas, você pode usar \h(ou seja, espaço em branco horizontal) como em^\h*$
ps.pf
5

Crédito total para bchr02 por esta resposta . No entanto, tive que modificá-lo um pouco para capturar o cenário das linhas que têm */(final do comentário) seguidas por uma linha vazia. O regex estava combinando a linha não vazia com */.

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

Tudo o que fiz foi adicionar ^como segundo caractere para indicar o início da linha.

John Henry
fonte
Por que não comentar a resposta de bchr02 e sugerir a melhoria de sua resposta?
precisa saber é o seguinte
1
@adamlogan sim, de memória, acho que queria fazê-lo na época, mas não tinha reputação suficiente para comentar no post de outra pessoa, então tive que fazer assim.
John
3

Aqui em branco significa o que você está querendo dizer.
Uma linha contém espaços em branco ou uma linha não contém nada.
Se você deseja combinar uma linha que não contém nada, use '/ ^ $ /'.

kiruthika
fonte
-1

Bem ... eu consertei (usando o notepadd ++) e esta é a solução que encontrei

\ n \ s

\ n para o final da linha (onde você inicia a correspondência) - o sinal de intercalação não ajudaria no meu caso, pois o início da linha é uma string \ s ocupa algum espaço até a próxima string

espero que ajude

M_TRONIC
fonte
O OP quer uma resposta de regex, que foi fornecida, e não trata de caracteres de nova linha.
Moody_Mudskipper 31/08/19
O usuário solicita um "regex simples que verifique se uma linha está em branco". Este regex (testado em regexpal.com) faz exatamente isso. por que você não testá-lo?
M_TRONIC 31/08
usando R, nosso vector de teste: test_vec <- c(" some"," ",""). sua solução: grepl("\\n\\s",test_vec) # [1] FALSE FALSE FALSEa solução votou: grepl("^\\s*$",test_vec) # [1] FALSE TRUE TRUE. a solução votada fornece o resultado esperado, o seu não.
Moody_Mudskipper
como eu disse, usei isso no bloco de notas ++ e funcionou. o seu não. então acho que podemos concordar em discordar!
M_TRONIC 31/08
Não tenho muita certeza do que você está fazendo, ctrl+fno bloco de notas ++? Nesse caso, você pode encontrar (embora não corresponda realmente) as linhas em branco selecionando o modo de pesquisa "Estendida" e pesquisando '\ n \ s'. Se você selecionar "Expressão regular", sua string corresponderá à mesma e você poderá tente também a solução dos @polygenelubricants. Este último realmente corresponderá à linha, você pode verificar e ver a diferença. Sugiro que você edite sua resposta para ter uma idéia mais clara do que está aconselhando, para que os leitores possam aproveitar mais -lo.
Moody_Mudskipper