Sou muito bom em RegEx, mas há uma coisa que não consigo entender como funciona.
Como alguém pesquisaria/substituiria no NotePad++ e garantiria que a saída tivesse um comprimento fixo, enquanto a entrada pudesse ser flexível?
Por exemplo, fazendo um regex sobre isso: 23-6-2016
para se tornar: 23-06-2016
(0 extra para 06, mas não se for 12, por exemplo)
Outra opção é criar isto:
TestString
e Test
se tornaria
TestString______________________
(espaços extras.)
Test____________________________
(espaços extras.)
Claro, a ideia aqui é fazer uma pesquisa/substituição em massa onde todas as saídas tenham o mesmo comprimento.
Por favor, explique o pensamento por trás disso.
EDIT: para dar uma ideia dos dados com os quais estou trabalhando, aqui está um exemplo de linha que preciso processar:
12345678 TXT 19700101 0 100 20160624 100 Comment text
12345678 TXT 19700101 100 100,25 20160624 0,25 Comment text
12345678 TXT 19700101 100,25 100,5 20160624 0,25 Comment text
Observe que eles estão separados por guias. O primeiro 0 da primeira linha deve ser formatado como 0,00, o 100 como 100,00, mas o 12345678 e as datas não devem ser formatadas com ,00 Os últimos 100,5 devem ser formatados como 100,50
Eu resolvi o assunto do encontro, então isso é menos importante agora.
Responder1
Em resposta a:
12345678 TXT 19700101 0 100 20160624 100 Texto do comentário 12345678 TXT 19700101 100 100,25 20160624 0,25 Texto do comentário 12345678 TXT 19700101 100,25 100,5 20160624 0,25 Texto do comentário
Para a 4ª coluna:
^((?:\S+\s+){3}\d+)(\s)
para \1,0\2
^((?:\S+\s+){3}\d+,\d)(\s)
para\10\2
Para 5ª/7ª coluna:
semelhante ao acima, basta substituir {3}
por {4}
/ {6}
na regra respectivamente
O1ª regraanexa ,0
a números sem ,
. Agora todos os números devem ter ,\d
.
O2ª regraanexa um 0
àqueles com um único dígito após a vírgula.
Quanto a(?:)
:grupo sem captura, as colunas anteriores já foram capturadas, \1
portanto a captura adicional é desnecessária.
Isso apenas preenche o número com 2 casas decimais. Para preencher uma quantidade arbitrária, use a pad excessively, then trim
abordagem.
Palavra final?
Na minha opinião, regex simples como no notepad++ é inadequado para esta tarefa. Alguns scripts básicos como bash ou perl teriam lidado com isso com uma legibilidade muito maior.
Responder2
Seção A: Almofada com comprimento específico
Para preencher à direita linhas com N caracteres usando expressões regulares, adicione N espaços ao final da linha e agrupe os primeiros N caracteres substituindo o restante.
Passo 1: Adicionar caracteres de preenchimento
Localizar: $
Substituir:______________________________
No final da linha adicione 30 espaços. (Usei sublinhados porque os espaços não seriam formatados na postagem).
Passo 2: Cortar 30 caracteres à esquerda
Para preencher uma data delimitada por traços no início de uma linha, combine cada seção de acordo.
Localizar: ^([[:print:]]{0,30}).*$
Substitua por\1
No início da linha, substitua um grupo de até trinta caracteres imprimíveis seguido por quaisquer caracteres restantes pelo grupo.
Para escolher um comprimento de linha diferente, use n-espaços na Passagem 1 e substitua 30 pelo comprimento na Passagem 2.
Seção B: Linha começando com data
Passe 1 (dia do mês):
Descubra o que: ^([0-9])-
Substitua por:0\1-
Substitua o padrão (linha começando com um único dígito seguido por um travessão) pelo zero preenchido, o dígito e o travessão.
Passe 2 (mês):
Descubra o que: -([0-9])-
Substitua por:-0\1-
Substitua o padrão (um único dígito entre dois travessões) por um travessão, o zero preenchido, o dígito e o travessão.