formatação de strings RegEx no Notepad ++

7

Eu sou muito bom em RegEx, mas há uma coisa que não consigo descobrir como funciona.

Como alguém poderia procurar / substituir no NotePad ++ e garantir que a saída tenha um tamanho fixo, enquanto a entrada pode ser flexível?

Por exemplo, fazendo um regex sobre isso: 23-6-2016 para se tornar: 23-06-2016 (extra 0 para 06, mas não se for 12 por exemplo)

Outra opção é criar isso:

TestString e Test se tornariam TestString______________________ (espaços extras).% Test____________________________ (espaços extras.)

É claro que a ideia aqui é fazer uma busca / substituição em massa, onde a saída tem o mesmo tamanho.

Por favor, explique o pensamento por trás disso.

EDIT: para ter uma ideia dos dados com os quais estou trabalhando, aqui está uma linha de exemplo 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 são separados por guias. O primeiro 0 na 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 comprei a data, então isso é menos importante agora.

    
por LPChip 23.06.2016 / 18:02

2 respostas

5

Em resposta a:

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

Para a 4ª coluna: ^((?:\S+\s+){3}\d+)(\s) to ,0 de ^((?:\S+\s+){3}\d+,\d)(\s) to

Para a 5ª / 7ª coluna:
semelhante ao acima, basta substituir {3} por {4} / {6} na regra, respectivamente

Explicação

O 1ª regra acrescenta ,0 aos números sem , . Agora todos os números devem ter ,\d .

O Segunda regra acrescenta um 0 àqueles com um único dígito após a vírgula.

Quanto ao (?:) : grupo sem captura , as colunas anteriores já foram capturadas como , portanto, a captura adicional é desnecessário.

Isso só preenche o número com duas casas decimais. Para preencher um valor arbitrário, use a abordagem pad excessively, then trim .

Palavra final?
Na minha opinião, 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.

    
por 24.06.2016 / 18:07
5

Seção A: Pad para um tamanho específico

Para alinhar linhas à direita 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. (Eu usei sublinhados porque os espaços não eram formatados no post).

Passo 2: aparar 30 caracteres

Para preencher uma data delimitada por traços no início de uma linha, corresponda a cada seção de acordo.

Localizar: ^([[:print:]]{0,30}).*$ Substituir por

No início da linha, substitua um grupo por até trinta caracteres imprimíveis, seguidos por quaisquer caracteres restantes no grupo.

Para escolher um comprimento de linha diferente, use n-espaços no Passe 1 e substitua 30 pelo comprimento no Passe 2.

Seção B: linha começando com data

Passe 1 (dia do mês):

Encontre o que: ^([0-9])- Substituir por: 0-

Substitua o padrão (linha começando com um único dígito seguido por um traço) com o zero preenchido, o dígito e o traço.

Passe 2 (mês) :

Encontre o que: -([0-9])- Substituir por: -0-

Substitua o padrão (um único dígito entre dois traços) por um traço, o zero preenchido, o dígito e o traço.

    
por 23.06.2016 / 21:33