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.
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:
@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).
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.
@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.
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.
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 '/ ^ $ /'.
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
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.
Respostas:
O padrão que você deseja é mais ou menos assim no modo de múltiplas linhas:
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
line
está "em branco" (ou seja, contendo apenas espaços em branco),trim()
pressionando-a e, em seguida, verificando se a string resultanteisEmpty()
.Em Java, isso seria algo como isto:
A solução regex também pode ser simplificada sem âncoras (por causa de como
matches
é definido em Java) da seguinte maneira:Referências de API
String String.trim()
boolean String.isEmpty()
true
se, e somente se,length()
é0
.boolean String.matches(String regex)
fonte
if line.strip():
uma vez que uma string vazia é avaliada comoFalse
Na verdade, no modo multilinha, uma resposta mais correta é esta:
A resposta aceita:
^\s*$
não corresponde a um cenário quando a última linha está em branco (no modo de múltiplas linhas).fonte
Tente o seguinte:
fonte
\s
também corresponde a quebras de linha, para que você não "encontre" linhas vazias únicas dentro de uma string contendo sucessivas linhas vazias.O regex mais portátil seria
^[ \t\n]*$
corresponder a uma sequência vazia (observe que você precisaria substituir\t
e\n
por tab e newline adequadamente) e[^ \n\t]
corresponder a uma sequência que não seja de espaço em branco.fonte
[ \t]
\r
para 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*$
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.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ê deseja combinar uma linha que não contém nada, use '/ ^ $ /'.
fonte
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
fonte
test_vec <- c(" some"," ","")
. sua solução:grepl("\\n\\s",test_vec) # [1] FALSE FALSE FALSE
a solução votou:grepl("^\\s*$",test_vec) # [1] FALSE TRUE TRUE
. a solução votada fornece o resultado esperado, o seu não.ctrl+f
no 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.