Combinando apenas a primeira ocorrência em uma linha com o Regex

32

Sou completamente novo no regex e agradeço muito qualquer ajuda.

A tarefa é simples. Eu tenho um arquivo CSV com registros que são assim:

12345,67890,12345,67890
12345,67890,12345,67890
12345,67890,12345,67890
12345,67890,12345,67890
12345,67890,12345,67890

Eu gostaria de substituir a primeira vírgula por um espaço e deixar o restante das vírgulas intactas, para cada linha. Existe uma expressão regex que corresponderá apenas à primeira vírgula?

Eu tentei isso: ^....., . Isso corresponde à vírgula, no entanto, ele também corresponde ao comprimento inteiro da string que precede a vírgula, portanto, se eu tentar substituí-la por um espaço , todos os números também serão excluídos.

    
por cows_eat_hay 05.04.2011 / 07:57

5 respostas

39

O padrão de correspondência pode ser:

^([^,]+),

Isso significa

^        starts with
[^,]     anything but a comma
+        repeated one or more times (use * (means zero or more) if the first field can be empty)
([^,]+)  remember that part
,        followed by a comma

Em p. perl, todo o jogo e substituir ficaria assim:

s/^([^,]+),/ /

A peça de reposição apenas pega a coisa toda que combina e a substitui pelo primeiro bloco que você lembrou e acrescenta um espaço. O coma é "descartado" porque não está no primeiro grupo de captura.

    
por 05.04.2011 / 08:26
4
s/,/ /

Isso, por padrão (ou seja, sem a opção g ), substitui apenas a primeira correspondência.

    
por 01.08.2012 / 23:31
1

Isso deve corresponder apenas ao primeiro número e à vírgula: ^(\d{5}), . Se você gostaria de devorar todo o resto da linha, mude o regex para isso: ^(\d{5}),(.*)$

    
por 05.04.2011 / 08:26
1

Uma solução mais elegante é usar correspondência preguiçosa:

s/^(.+?),/ /

que agrupará os caracteres movendo-se do início da string ( ^ ) para o final por um caracter ( .+? ) em cada etapa até encontrar o primeiro sinal de vírgula. Todo esse grupo junto com a primeira ocorrência de vírgula será substituído por grupo ( ) e caractere de espaço.

    
por 13.05.2015 / 02:44
0

O TextPad sempre teve a capacidade de usar a notação posix, mas você precisa alterar as configurações em uma caixa de diálogo diferente. Para usar as configurações padrão do TextPad para expressões regulares, você precisa "escapar" dos parênteses de abertura e fechamento:

Substitua o espaço após o CEP de 5 dígitos, no início de cada linha

^\([0-9]+\)[ ]

com aba

\t

Como acima, o ^ significa início da linha

\ (é um "parêntese de escape" e marca o início da primeira expressão de pesquisa, ou seja, os cinco dígitos

[0-9] + significa um ou mais dígitos (não apenas códigos postais de 5 dígitos)

\) é outro "parêntese de escape" para marcar o fim da primeira expressão de pesquisa

[] é apenas um caractere de espaço (você pode deixar de fora os colchetes, mas ninguém poderá vê-lo nesta página da Web: -)

Na expressão de substituição

\ 1 é a primeira expressão de pesquisa, a parte entre parênteses acima (um ou mais dígitos)

\ t é um caractere de tabulação

Portanto, o comando search and replace procura por um ou mais dígitos, seguido por um espaço. Em seguida, substitui tudo isso pelo mesmo grupo de dígitos seguido por uma tabulação.

Eu não acho que haja qualquer maneira de encontrar "um espaço que vem depois de 5 dígitos" para que você possa simplesmente substituir o espaço sem tocar nos dígitos. Você tem que encontrar os 5 dígitos (a primeira string) seguidos pelo espaço (a segunda string). Então, embora pareça redundante ou complicado, REPLACE a sequência original de 5 dígitos com ITSELF, seguida pela tabulação (a segunda sequência).

Todo mundo que sabe disso esquece que iniciantes não têm idéia sobre isso. É por isso que eu estou soletrando para você, meu amigo.

Ed Poor Tutor de Matemática e Programador de Computador aposentado Nova York

    
por 28.02.2015 / 22:07

Tags