Detectar Quebra de Linha

Tenho a seguinte função:

if (str.match(/\d\d\d\d\d\.\d\d\d\d\d/)) {
var codigo_velho = str.match(/\d\d\d\d\d\.\d\d\d\d\d\/);
result = “1”; }

Como alterar esta função para que ela detecte quebra de linha no match? Por exemplo, tentei com \n mas não deu certo:

if (str.match(/\d\d\d\d\d\.
\d\d\d\d\d/)) {
var codigo_velho = str.match(/\d\d\d\d\d\.
\d\d\d\d\d\/);
result = “1”; }

=================

  

 

Ja testou com a expressão \n dentro da regex? Tipo: \d\d\n\d…? Sei que quebrar a linha não funciona.
– Wakim
26/05/14 às 2:47

  

 

Tentou \r\n? Quebra de linha é meio variável…
– Felipe Avelar
26/05/14 às 2:49

  

 

@FelipeAvelar, tentei \r\n não deu certo..
– user7605
26/05/14 às 2:58

  

 

@Wakim, infelizmente não deu. Porque a linha de códigos que vem no MATCH, algumas delas pulam linha. tipo 222222\n222222, quando acontece isso ele não detecta.
– user7605
26/05/14 às 3:04

=================

4 Respostas
4

=================

A pergunta já foi amplamente respondida, então apenas farei uma sugestão, ao invés de utilizar .match() para detectar quebras de linha, use .test() para verificar se o conteúdo a testar contem ou não quebras de linha, algo assim:

verificarQuebra = function()
{
var valor = $(‘#div1’).html();
if (/[\n|\n\r]/.test(valor))
{
alert(“Existem quebras de linha!”);
} else
{
alert(“Não existem quebras de linha!”);
}
}

Demonstração aqui.

Existe diferença entre .match() e .test()?

A função .test() Faz a busca entre uma expressão regular e uma string especificada. Retorna true ou false. Já .match() é utilizado para obter os resultados ao combinar uma string contra uma expressão regular. Retorna uma array com os resultados ou nulo se não há nenhum. Logo null == false se a string não tem um resultado, o valor booleano será false.

O MDN cita o seguinte sobre:

Se você precisa saber se uma string corresponde a uma expressão
regular, use RegExp.test(str).

Em relação a performance existe uma diferença significativa? Segundo o JsPerf, sim, a diferença é de aproximadamente 30% ~ 60% dependendo do navegador. Detalhes retirado dessa resposta.

1

 

Bela resposta amigo @DBX8!
– user7605
26/05/14 às 23:22

Não use quebras de linha literais, use \n e uma salvaguarda para o \r: \r?\n. Assim funcionaria com quebras de linha estilo Unix (\n) e Windows (\r\n). A parte do match então ficaria assim:

str.match(/\d\d\d\d\d\.\r?\n\d\d\d\d\d/)

Ou encurtando um pouco com a sugestão do Leonardo Bosquett:

str.match(/\d{5}\.\r?\n\d{5}/)

  

 

Qual o motivo de usar a flag multiline neste caso? Até onde lembro, a flag m altera o comportamento das âncoras ^ e $ para match’ar no início e fim de cada linha invés do início e fim da string. Como você não está utilizando estas âncoras, esta flag não deve fazer diferença alguma.
– Fabrício Matté
26/05/14 às 15:47

  

 

Você tem razão @FabrícioMatté. Vou excluir a resposta, já que sem isso as outras já dizem tudo o que precisa ser dito.
– bfavaretto♦
26/05/14 às 16:21

1

 

Bom, eu não a excluiria, o seu \r?\n não está mencionado em nenhuma outra resposta, e também é a minha forma favorita de match’ar quebras de linhas. =]
– Fabrício Matté
26/05/14 às 16:42

  

 

Acatado @FabrícioMatté 🙂 Editei.
– bfavaretto♦
26/05/14 às 17:37

A quebra de linhas pode ter formatos diferentes. A melhor maneira de as “apanhar” é ser abrangente na regex.

Sugestão: string.match(/(\r\n|\n|\r)/gm);

O seletor \n é o essencial. Vale a pena ler esta resposta sobre diferenças entre \n e \r. Depois usei o g para me retornar todos os resultados, e não somente o promeiro, e ainda o m que quer dizer multiplas-linhas. No exemplo que coloco em baixo não é necessário mas como não sei exatamente como vai usar, coloquei.

Exemplo em funcionamento: http://jsfiddle.net/yL5Gk/

HTML

Quebra de linha 1:
– continua aqui
Quebra.
Quebra.

Quebrão 🙂

Nenhuma quebra

JavaScript

var mensagem = ”;
$(‘div’).each(function () {
var string = this.innerHTML;
var linhas = string.match(/(\r\n|\n|\r)/gm);
var quantidadeLinhas = linhas ? linhas.length : 0;
mensagem += ‘A div ‘ + this.id + ‘ tem ‘ + quantidadeLinhas + ‘ quebras de linha\n’;
});
alert(mensagem);

O alert que isso dá é:

A div div1 tem 1 quebras de linha
A div div2 tem 6 quebras de linha
A div div3 tem 0 quebras de linha

o teste de quebra de linha no Javascript por Regex é \n como o Wakin disse, veja o teste no console do Chrome:

caso tenha problemas com quebras de linha em versões difeentes de S.O tente isso:

var newExpression = expression.replace(“\r\n”, “\n”);

Ou simplesmente retirá-las da validação caso não sejam necessárias:

var newExpression = expression.replace(“\r\n”, “”);

Dica: expressões como \d\d\d\d podem ser simplificados por [\d]{4}

Indico este site também para testar suas expressões regulares:
http://regexpal.com/