Eu tenho alguns dados parecidos com este
john, dave, chris
rick, sam, bob
joe, milt, paul
Estou usando este regex para combinar os nomes
/(\w.+?)(\r\n|\n|,)/
que trabalha para a maior parte, mas as extremidades de arquivo abruptamente após a última palavra que significa o último valor não termina em \r\n
, \n
ou ,
ele termina com EOF. Existe uma maneira de corresponder EOF em regex para que eu possa colocá-lo nesse segundo agrupamento?
Respostas:
A resposta a esta pergunta
\Z
demorou um pouco para eu descobrir, mas agora funciona. Observe que, inversamente,\A
corresponde ao início de toda a string (em oposição a^
e$
correspondendo ao início de uma linha).fonte
(\s*)\?>(\s*)\Z
... e depois de mais escavações aqui está o que funcionaria em uma pasta de projeto :(\s*)\?>(\s*)(\n*)(\W)\Z
FYI: substitui todas as tags php de fechamento por quebras de linha no final do arquivo.\A
também funciona no Visual Studio, localizar e substituir. Como sempre, use essas coisas com cuidado, mas isso me salvou de uma tonelada de problemas manuais, uma vez que eu estava feliz que realmente faria a coisa certa.Scanner
classe Java para ler um arquivo inteiro de uma vez; se eu usar\Z
como delimitador, o caractere de nova linha final aparado. Quando alterei o delimitador para\z
, o caractere de nova linha final foi preservado. Parece que a resposta de Martin Dorey também se aplica a Java.EOF não é realmente um personagem. Se você tiver uma string de várias linhas, '$' corresponderá ao final da string e também ao final de uma linha.
Em Perl e seus irmãos,
\A
e\Z
combine o início e o fim da string, ignorando totalmente as quebras de linha.Extensões GNU para uso de regexes POSIX
\`
e\'
para as mesmas coisas.fonte
No Visual Studio, você pode encontrar EOF assim:
$(?![\r\n])
. Isso funciona se as terminações de linha são CR, CRLF ou apenas LF.Como um bônus, você pode garantir que todos os seus arquivos de código tenham um marcador de nova linha final, como:
Como funciona:
Encontre qualquer extremidade de linha (uma correspondência de largura zero) que não seja precedida por CR ou LF e também não seja seguida por CR ou LF. Algum pensamento irá mostrar por que isso funciona!
Observe que você deve Substituir pelo caractere de final de linha desejado, seja CR, LF ou CRLF.
fonte
Compare o comportamento do \ Z sugerido por Ryan com \ z:
perlre sez:
Uma tradução do caso de teste para Ruby (1.8.7, 1.9.2) se comporta da mesma forma.
fonte
Você realmente precisa capturar os separadores de linha? Caso contrário, esta regex deve ser tudo que você precisa:
Isso presumindo que todas as substrings que você deseja corresponder consistem inteiramente em caracteres de palavras, como em seu exemplo.
fonte
Talvez tente $ (EOL / EOF) em vez de (\ r \ n | \ n)?
fonte
Recentemente, eu estava procurando algo assim, mas JavaScript.
Colocando isso aqui, para que qualquer pessoa com o mesmo problema possa se beneficiar
Basicamente, isso corresponderia ao final da linha, que não é seguido por retorno de carro ou caracteres de nova linha. Em essência, isso é o mesmo,
\Z
mas para JavaScript.fonte
Assumindo que você está usando o modificador adequado forçando para tratar a string como um todo (não linha por linha - e se \ n funcionar para você, você está usando), basta adicionar outra alternativa - fim da string: (\ r \ n | \ n |, | $)
fonte
/(\w.+?)(\r\n|\n|,|$)/
fonte