Enquanto escrevia esta resposta , tive que corresponder exclusivamente em quebras de linha em vez de usar o s
sinalizador -flag ( dotall
- ponto corresponde a quebras de linha).
Os sites geralmente usados para testar expressões regulares se comportam de maneira diferente ao tentar corresponder em \n
ou \r\n
.
Percebi
O Regex101 corresponde apenas a quebras de linha em
\n
( exemplo - excluir\r
e corresponde)RegExr corresponde quebras de linha nem em
\n
nem em\r\n
e eu não posso encontrar algo para torná-lo coincidir com uma quebra de linha, exceto para om
-flag e\s
( exemplo )Debuggex comporta-se ainda mais diferente:
em este exemplo ele corresponde apenas no\r\n
, enquanto
aqui só corresponde a\n
, com as mesmas bandeiras e motor especificados
Estou plenamente ciente do m
-flag (multiline - faz ^
coincidir com o início e $
o final de uma linha), mas às vezes isso não é uma opção. O mesmo \s
acontece com a correspondência de tabulações e espaços também.
Meu pensamento de usar o caractere de nova linha unicode ( \u0085
) não foi bem-sucedido, então:
- Existe uma maneira segura de integrar a correspondência em uma quebra de linha (de preferência independentemente do idioma usado) em uma expressão regular?
- Por que os sites mencionados acima se comportam de maneira diferente (especialmente o Debuggex, correspondendo apenas uma
\n
vez e apenas uma vez\r\n
)?
fonte
[\r\n]+
- ou algo parecido com isto\r?\n
para combinar as seqüências de terminação\r\n
e de\n
linha. Não funciona para a\r
sintaxe antiga do Mac, mas essa é bastante rara atualmente.Respostas:
Vou responder na direção oposta.
2) Para uma explicação completa
\r
e\n
preciso me referir a esta pergunta, que é muito mais completa do que postarei aqui: Diferença entre \ n e \ r?Para encurtar a história, o Linux usa
\n
para uma nova linha, Windows\r\n
e Macs antigos\r
. Portanto, existem várias maneiras de escrever uma nova linha. Sua segunda ferramenta (RegExr) corresponde, por exemplo, ao single\r
.1),
[\r\n]+
como sugeriu Ilya, funcionará, mas também corresponderá a várias novas linhas consecutivas.(\r\n|\r|\n)
está mais correto.fonte
\r
/\n
estão dependendo do sistema operacional - isso é algo que se pode saber (;)) - mas por que os dois exemplos de debuggex correspondem uma vez em \ r \ n e uma vez em \ n? Pelo menos não há diferença (nos exemplos) visível para mim.\r\n
no texto (se você clicar com o botão direito do mouse e mostrar a fonte, encontrará{{Infobox XC Championships\r\n|Name =
algum lugar). A segunda ferramenta é escrita no Flash e, à medida que você lê a página inteira, fica um pouco buggy com caracteres de nova linha.(\r\n|\r|\n)
pode ser escrito de forma mais simples como\r\n?
\n
Você tem finais de linha diferentes nos textos de exemplo no Debuggex. O que é especialmente interessante é que o Debuggex parece ter identificado qual estilo de final de linha você usou primeiro e converte todas as terminações de linha adicionais inseridas nesse estilo.
Eu usei o Notepad ++ para colar texto de exemplo no formato Unix e Windows no Debuggex, e o que eu colei primeiro foi o que aquela sessão do Debuggex travou.
Portanto, você deve lavar seu texto através do seu editor de texto antes de colá-lo no Debuggex. Certifique-se de colar o estilo desejado. O padrão Debuggex é o estilo Unix (\ n).
Além disso, o NEL (\ u0085) é algo totalmente diferente: https://en.wikipedia.org/wiki/Newline#Unicode
(\r?\n)
cobrirá o Unix e o Windows. Você precisará de algo mais complexo(\r\n|\r|\n)
, se quiser combinar o Mac antigo também.fonte
Nos
\R
jogos PCRE\n
,\r
e\r\n
.fonte
(\r\n|\r|\n)
Isso se aplica apenas à pergunta 1.
Eu tenho um aplicativo que roda no Windows e usa uma caixa de editor MFC de várias linhas.
A caixa do editor espera quebras de linha CRLF, mas preciso analisar o texto digitado
com algumas regexs realmente grandes / desagradáveis '.
Eu não queria me estressar nisso enquanto escrevia a regex, então
acabei normalizando de um lado para o outro entre o analisador e o editor, para que
as regexs apenas usassem
\n
. Também interto com operações de colagem e as converto para as caixas.Isso não leva muito tempo.
É isso que eu uso.
fonte
Em Python:
ou mais rigoroso:
fonte